生成约束排除所有Go文件

生成约束排除所有Go文件,go,webassembly,Go,Webassembly,这是我第一次尝试进行Webassembly,我遇到了一个问题 我正在使用: go版本go1.14.3 linux/amd64 代码可通过以下方式正确编译: GOARCH=wasm GOOS=js go build-o lib.wasm main.go 当我这样做的时候:去运行main.go 我得到以下错误: main.go:8:2:构建约束排除/usr/local/go/src/syscall/js中的所有go文件 有什么办法解决这个问题吗 package main import (

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

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

代码可通过以下方式正确编译:

GOARCH=wasm GOOS=js go build-o lib.wasm main.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
}
不能使用GOARCH=wasm的go-run;go run执行构建的二进制文件,因为它不是OS本机二进制文件,而是wasm,所以最终操作系统将无法理解它的格式

关于如何直接使用wasm_exec.js shim和Node.js来执行WebAssembly二进制文件的说明已记录在上

要在浏览器中运行测试,有一个很好的Golang包。

您不能使用GOARCH=wasm的go-run;go run执行构建的二进制文件,因为它不是OS本机二进制文件,而是wasm,所以最终操作系统将无法理解它的格式

关于如何直接使用wasm_exec.js shim和Node.js来执行WebAssembly二进制文件的说明已记录在上


要在浏览器中运行测试,有一个很好的Golang软件包。

不要使用go run。为什么要使用go-run?此go-run main.go弊大于利。这看起来很无辜,但不是下面公认的答案所指出的,有一种方法可以让‘GOOS=js GOARCH=wasm去运行main.go’去工作。使用类似wasmbrowsertest的工具将go_js_wasm_exec二进制文件放入路径中,“go run”和“go test”将拾取它并使用它将wasm文件传递给chromedp。使获得测试结果感觉很快。不要使用go run。为什么要使用go-run?此go-run main.go弊大于利。这看起来很无辜,但不是下面公认的答案所指出的,有一种方法可以让‘GOOS=js GOARCH=wasm去运行main.go’去工作。使用类似wasmbrowsertest的工具将go_js_wasm_exec二进制文件放入路径中,“go run”和“go test”将拾取它并使用它将wasm文件传递给chromedp。使获得测试结果的感觉是瞬间的。感谢您参考wasmbrowsertest。它非常有用。在遵循安装说明之后,“GOOS=js GOARCH=wasm go run main.go”起了作用,因为它使用了“go run”的技巧来查找与go_js_wasm_exec名称匹配的可执行文件,从而将wasm传递给chromedp。在你读过一点之前,这似乎是一种魔力。谢谢你参考wasmbrowsertest。它非常有用。在遵循安装说明之后,“GOOS=js GOARCH=wasm go run main.go”起了作用,因为它使用了“go run”的技巧来查找与go_js_wasm_exec名称匹配的可执行文件,从而将wasm传递给chromedp。看起来像是魔法,直到你读了一点。