Golang中无法使用syscall/js的问题

Golang中无法使用syscall/js的问题 我想使用“syscall/js”,但在构建时遇到了错误:

flb.go:5:2: build constraints exclude all Go files in C:\Go\src\syscall\js

我的 Go 版本是 “go1.13.5 windows/amd64”。

我的代码如下:

package main

import (
	"fmt"
	"syscall/js"
)

func main() {
	var cb js.Func
	cb = js.FuncOf(func(this js.Value, args []js.Value) interface{} {
		fmt.Println("button clicked")
		cb.Release() // release the function if the button will not be clicked again
		return nil
	})
	js.Global().Get("document").Call("getElementById", "myButton").Call("addEventListener", "click", cb)
}

请帮我解决这个问题,并为我的英语不好表示歉意。


更多关于Golang中无法使用syscall/js的问题的实战教程也可以访问 https://www.itying.com/category-94-b0.html

4 回复

你是如何编译的?

使用那个包显然只在你编译为JavaScript或WASM时才会有效。

更多关于Golang中无法使用syscall/js的问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


告诉IDE为正确的操作系统和架构进行构建,它可能是在您主机的上下文中尝试编译和分析。

至少,如果像上面描述的那样从终端构建能够正常工作且没有错误,那么更改IDE的目标上下文应该会有所帮助。

你好,这是我的构建脚本。

SET GOOS=js
SET GOARCH=wasm
go build  -o flb.wasm fib.go

并且我的集成开发环境也报错了,请看图片。

goJsError

syscall/js 包仅在 WebAssembly 目标平台(GOOS=js, GOARCH=wasm)下可用。在 Windows 系统上直接构建会因构建约束而失败。以下是解决方案:

1. 交叉编译为 WebAssembly:

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

2. 使用 wasm_exec.js 加载 WASM 文件:

  • 从 Go 安装目录复制 wasm_exec.js 到项目目录:
cp "$(go env GOROOT)/misc/wasm/wasm_exec.js" .

3. 创建 HTML 文件加载 WASM:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <script src="wasm_exec.js"></script>
</head>
<body>
    <button id="myButton">Click me</button>
    <script>
        const go = new Go();
        WebAssembly.instantiateStreaming(
            fetch("main.wasm"),
            go.importObject
        ).then((result) => {
            go.run(result.instance);
        });
    </script>
</body>
</html>

4. 通过 HTTP 服务器运行:

# 使用 Python 快速启动服务器
python -m http.server
# 或使用 Node.js
npx serve .

访问 http://localhost:8000 即可测试按钮点击功能。

完整可运行的示例代码:

// main.go
package main

import (
    "syscall/js"
)

func main() {
    cb := js.FuncOf(func(this js.Value, args []js.Value) interface{} {
        println("button clicked")
        return nil
    })
    defer cb.Release()

    js.Global().Get("document").
        Call("getElementById", "myButton").
        Call("addEventListener", "click", cb)

    // 保持 Go 程序运行
    select {}
}

构建命令:

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

这样即可在浏览器中运行 Go WebAssembly 程序并使用 syscall/js 包。

回到顶部