+
95
-

golang如何编写一个webassembly程序?

go
golang如何编写一个webassembly程序?

网友回复

+
15
-

webassembly是什么?

webassembly是可以支持在web浏览器或者v8等环境下运行的二进制格式文件。

本文只介绍如何使用golang生成wasm文件,并在浏览器上执行。

开始

需要先升级go到1.11版本 编写需要编译成wasm文件的go文件
// main.go
package main

func main() {
	println("Hello, WebAssembly!")
}

执行build命令

GOARCH=wasm GOOS=js go build -o test.wasm main.go

注意这个是在mac或者linux操作系统下执行的命令,在windows下应该设置环境变量再执行编译命令

$env:GOARCH="wasm";$env:GOOS="js";

go build -o test.wasm main.go

命令执行完后,后生成test.wasm文件,这个就是可以在浏览器上运行的二进制文件

复制$(go env GOROOT)/misc/wasm/下的wasm_exec.html和wasm_exec.js两个文件到http的服务根目录 在浏览器中打开http://localhost:8080/wasm_exec.html,点击页面中的run按钮,即可看到控制台打印Hello, WebAssembly! 这样我们就已经可以使用go编写一个可以运行在浏览器的程序了

如何使用go的js库syscall/js来实现与js的相互调用

1、js调用go的方法

我们下面通过go生成一个webassembly程序暴露sum函数让js调用,代码如下:

// main.go
package main
 
import "syscall/js"
 
func sum(args []js.Value) {
	var sum int
	for _, val := range args {
		sum += val.Int()
	}
	println(sum)
}
func registerCallbacks() {
	js.Global().Set("sum", js.NewCallback(sum))
}
func main() {
	c := make(chan struct{}, 0)
	println("Hello, WebAssembly!")
	registerCallbacks()
	<-c
}

重新编译后,刷新页面,点击run按钮,就会为window对象挂载一个sum函数,在控制台可以调用

2、go调用js方法

// main.go
package main

import "syscall/js"

func main() {
	alert := js.Global().Get("alert")
	alert.Invoke("Hello World!")
}

编译生成main.wasm文件

html

<html>
<script src="static/wasm_exec.js"></script>
<script>
	const go = new Go();
	WebAssembly.i...

点击查看剩余70%

我知道答案,我要回答