TinyGo 对 WebAssembly 的支持和使用入门教程
将Go代码编译为WebAssembly的完整指南
TinyGo
为小型环境设计的Go编译器,基于LLVM,可将Go代码编译为WebAssembly格式,生成更小的二进制文件。
WebAssembly
可在现代Web浏览器中运行的二进制指令格式,提供接近原生的执行速度,支持多种编程语言编译。
下载deb包并安装
wget https://github.com/tinygo-org/tinygo/releases/download/v0.22.0/tinygo_0.22.0_amd64.deb
sudo dpkg -i tinygo_0.22.0_amd64.deb
使用Homebrew安装
brew tap tinygo-org/tools
brew install tinygo
下载ZIP文件并配置环境变量
1. 下载ZIP文件
2. 解压到C. \tinygo✅
3. 添加C. \tinygo\bin到PATH✅
验证安装:
tinygo version
创建Go模块:
mkdir tinygo-wasm-demo
cd tinygo-wasm-demo
go mod init tinygo-wasm-demo
编写main.go文件:
package main
import (
“fmt”
)
func main() {
fmt.Println(“Hello from TinyGo WebAssembly!”)
}
// 导出函数供JavaScript调用
//export add
func add(a, b int) int {
return a + b
}
编译为WebAssembly:
tinygo build -o main.wasm -target=wasm ./main.go
创建HTML文件加载WebAssembly:
<script>
async function loadWasm() {
const response = await fetch(‘main.wasm’);
const buffer = await response.arrayBuffer();
const results = await WebAssembly.instantiate(buffer);
const instance = results.instance;
// 调用导出的函数
const sum = instance.exports.add(5, 3);
console.log(“5 + 3 =”, sum);
}
loadWasm();
</script>
减小代码大小
使用-opt=2 -no-debug参数
启用垃圾回收
使用-gc=conservative参数
使用调度器
使用-scheduler=asyncify参数
TinyGo对Go标准库的支持有限,不是所有包都能在TinyGo中使用。
WebAssembly环境中的内存有限,需要注意内存使用。
与JavaScript交互会有一定的开销,应尽量减少交互次数。
TinyGo WebAssembly的调试可能比较困难,建议多使用日志。