WebAssembly
hellow world
package main

import "fmt"

func main() {
	fmt.Println("Hello, WebAssembly!")
}
WebAssemblyGOOS=jsGOARCH=wasm

设置方法有两种:

go env -w GOOS=js GOARCH=wasmcdGOOS=js GOARCH=wasm go build -o main.wasm
main.wasm.wasmhttpContent-Type
mainWebAssembly
main.wasm
index.html
<html>
	<head>
		<meta charset="utf-8"/>
		<script src="wasm_exec.js"></script>
		<script>
			const go = new Go();
			WebAssembly.instantiateStreaming(fetch("main.wasm"), go.importObject).then((result) => {
				go.run(result.instance);
			});
		</script>
	</head>
	<body></body>
</html>
main.wasmgo/misc/wasm/wasm_exec.jswasm_exec.js
wasmContent_typenginxapplication/wasm        wasm;wasm
index.htmlconsoleHello, WebAssembly

测试

wasmbrowsertest
go get github.com/agnivade/wasmbrowsertest
GOOS=js GOARCH=wasm go test -exec="$GOPATH/bin/wasmbrowsertest"

与DOM交互

syscall/js

这个包还是实验性的,所以随时都有可能会有变更。

div
hello worldbodydiv
<div id="id1">test web assembly</div>
<div id="id2"></div>
<div id="id3"></div>
main.go
package main

import (
	"fmt"
	"syscall/js"
)

func main() {
	fmt.Println("Hello, WebAssembly")
	s := js.Global().Get("document").Call("getElementById", "id1").Get("innerHTML").String()
	fmt.Println(s);
	js.Global().Get("document").Call("getElementById", "id2").Set("innerHTML", "这里是go写入的文本")
	js.Global().Get("document").Call("getElementById", "id3").Set("innerHTML", js.ValueOf("这里是go写入的文本2222"))
}
getset

调试

WebAssemblyprintln()console