我最近发现Go可以编译到WebAssembly。凉!
根据这个 Go 文档,Go 工具链本身是用 Go 编写的。
这让我想到,Go 编译器可以在浏览器中运行吗?我可以制作一个通过上传按钮给出文件路径的网站(虽然,没有上传任何东西(,可以编译一个 Go 项目并将可执行文件作为"下载"返回吗?
我正在寻找的最终结果是保存到磁盘的可执行文件,而不是在浏览器中运行的 Go 代码,但只要这是最终结果,我就不需要遵循上面的确切场景。
如果这是可能的,有什么限制(如果有的话(?
我看过的其他资源:
- GitHub 上 Go to WASM 的编译器
- 有人在处理输入的 Go 代码在浏览器中运行的游戏
编辑:我已经开始基于一个类似的项目进行这项工作。存储库可以在这里找到:https://github.com/TR-SLimey/IBGC
这是可能的,但很难做到。
您无法使用 WebAssembly 访问文件。相反,您需要用户在网页内放置一个文件夹,并使用文件和目录条目 API 获取文件及其内容。
但真正的问题是将文件从JS传递到WASM,反之亦然。您还需要在编译器源代码中替换对 Go 标准库的所有调用,这些调用将访问对 JS 函数的调用的文件。这些函数需要直接访问 WASM 内存。您将需要对编译器进行大量修改。
若要下载二进制文件,可以创建一个Blob
,使用URL.createObjectURL()
获取该 blob 的 URL,创建一个具有.download = true
和.href = <the blob URL>
的<a>
元素,然后.click()
它。
性能可能比直接运行 Go 编译器差,但除此之外,它应该可以正常工作。