tinygo-org/tinygo
硬件与物联网用基于 LLVM 的 Go 编译器,为单片机、WebAssembly 等小型目标生成体积很小的程序。
TinyGo 是一个面向“小地方”的 Go 编译器:微控制器、WebAssembly(WASM/WASI)和命令行工具。它更适合已经会写 Go、又想把程序放到开发板上或对体积敏感的 WASM 模块里的人;如果你要的是标准 Go 工具链的通用替代品,它并不是这个定位。
工作原理
TinyGo 复用 Go 工具链的库,但接入 LLVM 后端,用体积小、资源占用低来换取与标准编译器不同的取舍。README 把目标讲得很直接:不为用不到的东西付出开销,并且在单核微控制器上也保留 Go 内存模型(因而需要垃圾回收)。它明确不追求和 gc 一样快、不追求在大量 goroutine 下仍然高效,也不承诺能编译所有现有 Go 程序 README。
一条典型流程,三类目标
嵌入式场景通常按开发板目标来用:选一块受支持的板子,用板名编译并烧录。README 的 blinky 示例不改代码,只换 target,就能跑在 Arduino Uno、Adafruit Circuit Playground Express 或 Seeed XIAO-ESP32S3 上 README。README 称支持 150 多块微控制器开发板,板卡清单在项目网站上维护 微控制器参考。
WebAssembly 方面,TinyGo 能生成给浏览器用的 WASM,也能生成给服务器和边缘设备用的 WASI。文档给出的部署例子包括 Fastly Compute、Fermyon Spin 和 wazero README。一位 2022 年的 HN 评论者称,相比标准 Go,输出体积大约缩小到 1/10,并把 TinyGo 编译出的库用于 Python、PHP、JavaScript 和 C++,同时提到跨语言调用仍有不少粗糙之处 HN 评论。这只能当作某位用户在当时的体验,不是基准保证。
TinyGo 也能编译 Linux、macOS 和 Windows 目标,这些在项目网站上有单独文档 Linux 指南,不过它的主要价值仍在小目标上。
先确认的要求和限制
- 安装按项目的入门说明进行,也提供 Docker 方式;本文不复述具体安装步骤 入门说明、Docker 工作流。
- 语言覆盖是部分覆盖,这是设计取舍。移植现有程序前,先查语言支持页面,不要假设标准库和语言特性与标准 Go 完全一致 语言支持。2022 年有评论称,把使用
json.Unmarshal的程序编译到 WASM 时会 panic,这说明对旧版本做这类检查是必要的 HN 评论。 - 移动端不是支持目标:一位维护者在 2022 年表示当时不支持 Android 和 iOS,但支持 Linux/ARM HN 回复。
- 许可证是 BSD 3-clause,部分源自 LLVM 的文件使用 Apache 2.0 变体,部分源自 Teensy 的代码使用 PJRC 许可证,均在文件头注明 README。如果要再分发或内置该编译器,需要核对这些条款。
HotRepo 点评
HotRepo 在 2026-10-29 的 Go 周榜记录到 +30 stars,当天最高排到第 17 名;已存样本只有这一天,因此无法说明趋势。项目创建于 2018 年,当前是否适合你,仍应以 README 的支持目标和语言支持页面为准 仓库。
本文由 AI 根据项目 README 生成,更新于 2026年10月29日,以项目官方文档为准。