网上文章大多废话较多,这里做个提炼过的总结。

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

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

然后就是关键的需要在html中引入的东西了

<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>

需要注意的是,这里的wasm_exec.js最好去你的本地直接拷贝过来

D:\Go\misc\wasm地址下拷贝对应版本的wasm_exec.js到项目中才可以正常使用

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

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);
}

以上就是超级简单的入门教程了。