我想使用从Golang构建的webassembly库来编写JS脚本。但我需要使用C库并通过CGO使用它。
简而言之,我的代码看起来像这样(只是加载C库的例子):
…
那不会飞: GOARCH=wasm GOOS=js 基本上使Go编译器生成 wasm字节码 来自 去源。 换言之,Go代码被编译为WASM字节码,WASM API调用而不是CPU特定的机器代码和系统调用特定的OS内核。
GOARCH=wasm GOOS=js
另一方面, cgo 是一种方式 链接 该 编译 用C代码 编译 去代码。编译一个使用的程序 cgo , go 工具链调用真正的C编译器( gcc 大部分时间),编译C部分。
cgo
go
gcc
编译的C代码和WASM字节码存在于不同的宇宙中,彼此不了解。从理论上讲,一个C编译器如 gcc 可能有一个WASM支持的就像 go 现在已经有了,但是IIRC既不是这种情况也不是Go的WASM后端被教导以某种方式处理这种情况。
总而言之,最典型的使用案例 cgo 正在与用C编写的现有库(或暴露C兼容的API)接口,大多数这样的库通常会对它们运行的环境做出深刻的假设,这些环境通常是兼容POSIX的OS(带有一组)系统调用来处理文件和套接字I / O等)。
因此,如果您处于一个罕见的位置,需要与执行纯数据处理并且不以任何方式与底层操作系统通信的“纯”C库链接,则可能会查看C -to-Go源代码翻译器。