webassembly例子2

webassembly例子2

go向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
package main

import (
"syscall/js"
)

func calcpi(n int) float64 {
pi := 0.0
flag := 1.0
for i := 0; i < n; i++ {
pi += flag * (1.0 / (2.0*float64(i) + 1))
flag = -flag
}
return pi * 4.0
}

func calcpiWrapper(this js.Value, args []js.Value) interface{} {
n := args[0].Int()
return calcpi(n)
}

func main() {
c := make(chan bool)
js.Global().Set("calcpigo", js.FuncOf(calcpiWrapper))
<-c
}

在js中注册go函数的方法和把c函数注册到python,lua方法类似,但go需要使用channel来保证main函数不会结束,否则在浏览器中调用注册的函数会提示go的运行库已经结束

前端

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

<head>
<meta charset="utf-8" />
<script src="wasm_exec.js"></script>
<script>
function calcpi(n) {
let pi = 0.0
let flag = 1
for (let i = 0; i < n; i++) {
pi += flag * (1.0 / (2.0 * i + 1.0))
flag = -flag
}
return pi * 4
}
const go = new Go();
WebAssembly.instantiateStreaming(fetch("./main.wasm"), go.importObject).then((result) => {
go.run(result.instance);
let n = 1000000000
console.time("go")
console.log(calcpigo(n))
console.timeEnd("go")
console.time("js")
console.log(calcpi(n))
console.timeEnd("js")
});
</script>
</head>

<body></body>

</html>

在js中实现了一个同样效果的函数,对比了一下webassembly与js的速度,但是发现webassembly居然比js慢,不知道是什么原因

总结

go还有许多库使用以上的方法将一些js库绑定成go的库,使得go有可以直接调用js的能力