2020 zig go webassembly (1)
go_webassembly.jpeg
想写一个自己框架,去年这个时候我就筹备,不过因为种种原因还是放弃了,主要是当时的实力还是不足,随着学习了一段时间,学习了 go 和 rust 这些底层语言,让我们多计算机和语言设计有一定高度认识,回头再看 javascript ,有了新的感觉。
上一次说过了 zig 中 g 代表了 go,希望 zig 称为一个在 web 端支持 3D 渲染的框架,因为 react 和 vue 他们已经把 javascript 框架玩到极致,javascript 框架已经固化,没有任何缝隙能够进入这个角逐场。
既然无力与其争夺一席之地,就需要借助外力,go 和 rust 随即登场。
package main
import "fmt"
func main(){
fmt.Println("hellow wasm")
}
我们项目最好在 go 的 src 文件夹下创建一个项目文件夹,写好了上面代码我们就可以使用下面命令进行编译出 wasm
GOOS=js GOARCH=wasm go build -o test.wasm
然后在 go 安装目录下/misc/wasm/ 目录下,创建一个 test 然后把生成的 test.wasm 放置到这个创建好的 test 文件夹下,并且将 wasm_exec.js 复制到 test 文件夹下。接下来就写我们的 html 文件
005.JPG
在 index.js 中,将 test.wasm 读取,使用 instantiateStreaming 加载 wasm 文件,加载完成后会回调函数 result 得到 wasm 内容,然后用 go 的 run 来运行我们上面写 go 编译字节码的 wasm 文件,
const go = new Go();
WebAssembly.instantiateStreaming(fetch("test.wasm"), go.importObject).then((result) => {
go.run(result.instance);
});
这的注意的是我开始用 nodejs 写了一个服务启动时,会报一个 wasm/application 的错误,需要我们用 go 写一个服务器加载静态页面。下面写一个比较复杂的例子。
package main
import (
"fmt"
"syscall/js"
)
func add(a, b int) int {
return a + b
}
func foo(this js.Value, args []js.Value) interface{} {
fmt.Println("hellow wasm")
fmt.Println(args)
return nil
}
func main() {
js.Global().Set("foo", js.FuncOf(foo))
js.Global().Set("value", 100)
select {}
}
上面代码也不算复杂,估计大家一看就懂,我们 js.Global 也就是 window 对象上挂载全局方法和变量,this js.Value, args []js.Value便于我们在 js 调用 go 方法传入参数。
006.JPG
发表评论 (审核通过后显示评论):