Golang中无法识别"syscall/js"导入路径问题解析

Golang中无法识别"syscall/js"导入路径问题解析 我正在尝试使用 WebAssembly,但无法运行以下代码:

import (
    "syscall/js"
)

或者

GOARCH=wasm GOOS=js go get -u github.com/siongui/godom/wasm

来安装 wasm

它抛出了一个错误:

cannot find package "syscall/js" in any of:

非常感谢

4 回复

1.6.2 版本太旧了!该升级了! https://golang.org/dl/

更多关于Golang中无法识别"syscall/js"导入路径问题解析的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


hi Jay! 非常感谢您花时间回答我的问题。我确实运行了go version命令,我的版本是"go1.6.2 linux",但仍然找不到syscall/js。不过我仍然有syscall包。

hi Jay! 非常感谢您花时间回答我的问题。我确实运行了go version命令,我的版本是"go1.6.2 linux",但仍然找不到syscall/js。不过我仍然有syscall包。

syscall/js 包是 Go 1.11 版本新增的功能。请确保您安装了最新版本的 Go。1.11 版本于 2018 年 8 月发布。(go version 命令会显示已安装的 Go 版本。)

除此之外,您无需安装任何其他内容来支持 WebAssembly。请在 $GOROOT/misc/wasm 目录中查找 wasm_exec.js 文件,其中包含了加载 wasm 文件所需的大部分 JavaScript 胶水代码。此外,还需要在 HTML 文件中添加一些 JavaScript 代码来加载 wasm_exec.js,进而加载您的 wasm 可执行文件。

我在其他论坛主题中对此有更多评论,并且在我的 GitHub 站点上有两个示例:

https://github.com/Yaoir/ClockExample-Go-WebAssembly
https://github.com/Yaoir/VideoPoker-Go-WebAssembly

我将时钟网页应用设计得非常简单,以帮助其他人入门 WebAssembly。视频扑克应用的功能则更为丰富。请查阅 README 文件的末尾部分,了解构建 WebAssembly 应用的相关信息。

如果您还没有查看过这个页面,也请看一下:https://github.com/golang/go/wiki/WebAssembly

您遇到的问题是由于 syscall/js 包仅在特定的 Go 版本和构建目标下可用。该包专门用于 WebAssembly (Wasm) 目标,并且要求 Go 版本至少为 1.11(推荐使用 1.13 或更高版本以获得更好的支持)。以下是详细解析和解决方案:

问题原因

  1. 构建目标不匹配syscall/js 仅在 GOOS=jsGOARCH=wasm 时可用。如果您在非 Wasm 环境中编译(例如,默认的 GOOS=linuxGOOS=darwin),Go 工具链无法找到此包。
  2. Go 版本过旧:如果 Go 版本低于 1.11,syscall/js 可能未包含或存在兼容性问题。

解决方案

  1. 检查并设置正确的环境变量: 在编译 Wasm 代码时,必须明确指定目标操作系统和架构。使用以下命令设置环境变量并编译:

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

    或者直接在一次命令中设置:

    GOOS=js GOARCH=wasm go build -o main.wasm your_file.go
    
  2. 验证 Go 版本: 运行 go version 确保版本至少为 1.11。如果版本过旧,请从 Go 官网 升级。

  3. 完整示例代码: 创建一个简单的 Go 文件(例如 main.go),使用 syscall/js 包:

    package main
    
    import "syscall/js"
    
    func main() {
        // 注册一个全局函数供 JavaScript 调用
        js.Global().Set("goAdd", js.FuncOf(func(this js.Value, args []js.Value) interface{} {
            if len(args) != 2 {
                return "Invalid number of arguments"
            }
            a := args[0].Int()
            b := args[1].Int()
            return a + b
        }))
    
        // 保持程序运行以避免 Wasm 退出
        select {}
    }
    

    编译为 Wasm:

    GOOS=js GOARCH=wasm go build -o main.wasm main.go
    
  4. 使用正确的 Wasm 执行环境: 编译后,您需要将生成的 main.wasm 文件与 Go 提供的 JavaScript 支持文件(wasm_exec.js)一起在浏览器中运行。获取 wasm_exec.js

    cp "$(go env GOROOT)/misc/wasm/wasm_exec.js" .
    

    然后创建一个 HTML 文件加载 Wasm 模块:

    <html>
      <head>
        <script src="wasm_exec.js"></script>
      </head>
      <body>
        <script>
          const go = new Go();
          WebAssembly.instantiateStreaming(fetch("main.wasm"), go.importObject).then((result) => {
            go.run(result.instance);
          });
          // 调用 Go 函数示例
          console.log(goAdd(5, 3)); // 输出 8
        </script>
      </body>
    </html>
    
  5. 安装 Wasm 相关工具: 对于您提到的 go get 命令,确保在正确环境下执行:

    GOOS=js GOARCH=wasm go get -u github.com/siongui/godom/wasm
    

通过以上步骤,syscall/js 导入问题应得到解决。如果错误持续,请检查 Go 环境变量(go env)并确认无拼写错误。

回到顶部