“no Go files in”错误源于TinyGo硬性要求main.go必须位于go.mod所在根目录且包名为package main;需cd至该目录执行tinygo build,不支持子路径或非main包。

tinygo build 报 “no Go files in” 怎么办
这不是项目结构问题,而是 TinyGo 对入口文件位置的硬性要求。它不认子目录、不读 go.mod 里的 module 路径,只找当前目录下的 main.go。
-
main.go必须在go.mod所在目录(即模块根目录),不能放在cmd/或src/里 - 包声明必须是
package main,不能是package main_test或其他名字 - 执行命令时工作目录要对:先
cd进模块根目录,再运行tinygo build -target=esp32 -o firmware.bin - 如果用 VS Code,注意终端默认路径可能不是项目根目录,容易误操作
烧录失败:设备找不到或 permission denied
TinyGo 编译完只是生成固件,烧录靠外部工具链(esptool.py 等),不是 Go 自己完成的。失败基本都卡在这步。
- Linux 下常见权限问题:加用户到
dialout组后必须重新登录终端才生效,仅重启终端窗口不够 - macOS 上 CH340 芯片板子(多数国产 ESP32)需手动装 WCH 驱动,系统自带 CDC 驱动会识别但无法通信
- ESP32 烧录前必须按住 BOOT 键再按 EN 进入下载模式——跳过这步,
esptool就连不上,报错像No serial ports found - 端口名不稳定?用
tinygo flash -port=/dev/ttyUSB0 -target=esp32显式指定,别依赖自动探测
GPIO 控制没反应,LED 不亮或电平异常
微控制器引脚编号和板子丝印、Arduino 定义都不一致。TinyGo 的 machine.Pin 是逻辑编号,不是物理脚号,也不是 LED_BUILTIN。
- 查你用的开发板型号对应文档,确认
machine.LED是否真指向板载 LED;很多 ESP32 板子实际是machine.Pin(2)或machine.Pin(5) -
Configure()必须显式调用:led.Configure(machine.PinConfig{Mode: machine.PinOutput}),否则led.High()无效 - 读按键要用上拉输入:
button.Configure(machine.PinConfig{Mode: machine.PinInputPullup}),写成PinInput就没上拉,悬空状态不可靠 - 配置只能在
main()开头做一次,重复调用Configure()在多数 target 上静默失败
fmt.Printf 乱码或根本没输出
UART 初始化和波特率不匹配是主因。TinyGo 的 fmt 依赖底层串口,但不是所有 target 都默认启用、也不是所有芯片都支持完整格式化。
立即学习“go语言免费学习笔记(深入)”;
- 必须先初始化串口:
machine.Serial.Configure(machine.UARTConfig{BaudRate: 115200}),再用fmt.Printf - 波特率要和串口终端(如
screen、minicom、arduino-ide监控器)完全一致,差一点就全乱码 - 某些 bare-metal target(如
arduino)压根没实现os.Stdout,fmt.Printf会编译失败;此时改用machine.Serial.Write([]byte("hello")) - ESP32 默认 UART0 是下载口,打印建议用 UART1 或 UART2,避免和烧录冲突
net/http 根本不存在,time.Sleep 在部分 target 上精度极差,这些细节不翻 target 文档很难发现。


















