构建约束排除所有的 Go 文件。

3

这是我尝试使用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
}

1
不要使用 go run。(你为什么想要使用 go run?) - torek
这个 go run main.go 带来的负面影响比好处多得多。它看起来无害,但实际上并非如此。 - Volker
正如下面被接受的答案所指出的那样,有一种方法可以让“GOOS=js GOARCH=wasm go run main.go”工作。使用像wasmbrowsertest这样的工具将go_js_wasm_exec二进制文件放入PATH中,“go run”和“go test”将会捕获它并用它来传递wasm文件给chromedp。这使得获取测试结果感觉瞬间完成。 - WeakPointer
1个回答

4
你不能使用 GOARCH=wasmgo rungo run 执行已构建的二进制文件,因为它不是操作系统原生的二进制文件,而是 wasm,所以操作系统无法理解其格式。

如何直接使用 wasm_exec.js shim 或者 Node.js 执行 WebAssembly 二进制文件的说明已经写在了 golang/go repository 的 WebAssembly wiki 页面 上。

要在浏览器中运行测试,可以使用很好的 Golang 包 agnivade/wasmbrowsertest


感谢提供wasmbrowsertest的参考,它非常有用。按照其安装说明后,“GOOS=js GOARCH=wasm go run main.go”确实可以工作-因为它使用了“go run”的技巧来查找与名称go_js_wasm_exec匹配的可执行文件,以将wasm传递给chromedp。在了解一些相关知识之前,这似乎像是魔法。 - WeakPointer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接