构建约束排除所有 Go 文件

build constraints exclude all Go files

这是我第一次尝试做 Webassembly,我遇到了一个问题。

我正在使用: go版本go1.14.3linux/amd64

代码正确编译:

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

当我这样做时:go 运行 main.go

我收到以下错误:

main.go:8:2: 构建约束排除 /usr/local/go/src/syscall/js

中的所有 Go 文件

有什么解决办法吗?

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 runGOARCH=wasm 一起使用; go run 执行构建的二进制文件,因为它不是 OS 原生二进制文件而是 wasm 它最终会导致操作系统不理解它的格式。

如何直接使用 wasm_exec.js shim 和 Node.js 直接执行 WebAssembly 二进制文件的说明写在 WebAssembly wiki page of golang/go repository.

为了 运行 在浏览器中测试有很好的 Golang 包 agnivade/wasmbrowsertest