这是我尝试使用Webassembly的第一次尝试,但我遇到了一个问题。
我在使用: go version go1.14.3 linux/amd64
代码可以通过以下方式进行编译:
GOARCH=wasm GOOS=js go build -o lib.wasm main.go
当我执行:go run main.go
我会得到以下错误:
main.go:8:2: build constraints exclude all Go files in /usr/local/go/src/syscall/js
有什么解决办法吗?
package main
import (
"flag"
"log"
"net/http"
"strconv"
"syscall/js"
)
var (
listen = flag.String("listen", ":8080", "listen address")
dir = flag.String("dir", ".", "directory to serve")
)
func add(i []js.Value) {
value1 := js.Global().Get("document").Call("getElementById", i[0].String()).Get("value").String()
value2 := js.Global().Get("document").Call("getElementById", i[1].String()).Get("value").String()
int1, _ := strconv.Atoi(value1)
int2, _ := strconv.Atoi(value2)
js.Global().Get("document").Call("getElementById", i[2].String()).Set("value", int1+int2)
}
func subtract(i []js.Value) {
value1 := js.Global().Get("document").Call("getElementById", i[0].String()).Get("value").String()
value2 := js.Global().Get("document").Call("getElementById", i[1].String()).Get("value").String()
int1, _ := strconv.Atoi(value1)
int2, _ := strconv.Atoi(value2)
js.Global().Get("document").Call("getElementById", i[2].String()).Set("value", int1-int2)
}
func registerCallbacks() {
js.Global().Set("add", new(func()))
js.Global().Set("subtract", new(func()))
//js.Global().Set("subtract", js.NewCallback(subtract))
//cannot use add (type func([]js.Value)) as type func(js.Value, []js.Value) interface {} in argument to js.FuncOf
//js.Global().Set("add", js.FuncOf(add))
//js.Global().Set("subtract", js.FuncOf(subtract))
}
func main() {
flag.Parse()
log.Printf("listening on %q...", *listen)
log.Fatal(http.ListenAndServe(*listen, http.FileServer(http.Dir(*dir))))
c := make(chan struct{}, 0)
println("WASM Go Initialized")
// register functions
registerCallbacks()
<-c
}
go run
。(你为什么想要使用go run
?) - torekgo run main.go
带来的负面影响比好处多得多。它看起来无害,但实际上并非如此。 - Volker