Golang生成wasm,代码示例如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
package main

import (
	"syscall/js"
)

// 导出add函数
func add(this js.Value, inputs []js.Value) interface{} {
	a := inputs[0].Int()
	b := inputs[1].Int()
	return a + b
}

// 导出add函数
func mul(this js.Value, inputs []js.Value) interface{} {
	a := inputs[0].Int()
	b := inputs[1].Int()
	return a * b
}

func main() {
	c := make(chan struct{}, 0)

	// 注册add函数
	js.Global().Set("add", js.FuncOf(add))
	js.Global().Set("mul", js.FuncOf(mul))

	<-c
}

使用下面的命令编译并打包成wasm。注意golang需要版本>11

1
2
3
set GOOS=js   
set GOARCH=wasm  
go build -o main.wasm main.go

在html中引入js

1
2
3
<meta http-equiv="Content-Security-Policy" content="script-src 'self' 'unsafe-inline' 'unsafe-eval'">
<script src="wasm_exec.js"></script>
<script src="index.js"></script>

然后就是index.js中的调用了

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
const go = new Go();

WebAssembly.instantiateStreaming(fetch("app/main.wasm"), go.importObject)
    .then((result) => {
        go.run(result.instance);

        // 调用导出函数
        const sum = add(2, 3);
        console.log(`The sum of 2 and 3 is ${sum}.`);

        const ji = mul(2, 3);
        console.log(`The mul of 2 and 3 is ${ji}.`);
    })
    .catch((err) => {
        console.error(err);
    });

// 导入参数对象
const imports = {
    env: {
        log: function (str) {
            console.log(str);
        },
    },
};

// 注册导出函数
function add(x, y) {
    return window.wasmAdd(x, y);
}

// 注册导出函数
function mul(x, y) {
    return window.wasmMul(x, y);
}