使用Golang来探索WebAssembly
这是马克罗大学(近畿大学)Advent Calendar第16天的文章。
由于时间紧迫,我没有按照原计划写文章,这篇作品与最初计划的不同。
Web Assembly是什么?
在现代浏览器中,有一种技术可以运行机器码以实现加速。
据说大多数现代浏览器都支持该技术。
可以将用C或Rust编写的代码编译成Web Assembly的二进制文件并使用。
Go语言从1.11版本开始支持该技术。
教程
在浏览器控制台中输出文本。
package main
import "fmt"
func main() {
fmt.Println("Hello wasm!")
}
将其编译成.wasm文件。
GOOS=js GOARCH=wasm go build -o test.wasm main.go
我将获取用于加载.wasm文件的HTML和JavaScript代码。
curl -sO https://raw.githubusercontent.com/golang/go/master/misc/wasm/wasm_exec.html
curl -sO https://raw.githubusercontent.com/golang/go/master/misc/wasm/wasm_exec.js
建立一个简易的Web服务器。
package main
import (
"flag"
"log"
"net/http"
)
var (
listen = flag.String("listen", ":8080", "listen address")
dir = flag.String("dir", ".", "directory to serve")
)
func main() {
flag.Parse()
log.Printf("listening on %q...", *listen)
log.Fatal(http.ListenAndServe(*listen, http.FileServer(http.Dir(*dir))))
}
启动服务器。
go run server.go
如果访问 localhost:8080/wasm_exec.html 并点击运行按钮,在控制台中显示“Hello wasm”即表示成功。如果出现“Uncaught (in promise) LinkError: WebAssembly Instantiation: Import #5 module=”go” function=”runtime.scheduleCallback” error: function import requires a callable” 的错误提示,尝试将js文件替换为 https://raw.githubusercontent.com/golang/go/release-branch.go1.11/misc/wasm/wasm_exec.js ,或许可以解决问题。
DOM操作的中文释义是文档对象模型操作。
使用syscall/js来接触Go和JavaScript。
import "syscall/js"
获取document对象
document := js.Global().Get("document")
调用document的getElementById(“text”)方法。
element := document.Call("getElementById", "text")
获取innerText的值
text := element.Get("innerText").String()
在innerText中设置值。
element.Set("innerText", "Hello World")
以下是您的参考:
进行WebAssembly教程 – 构建计算器教程 | TutorialEdge.net
js – Go编程语言
misc/wasm:this._inst.exports.getsp不是一个函数 · 问题 #28924 · golang/go
尝试快速转换Go到WebAssembly – Qiita