Golang官方对WASM的支持

Golang官方对WASM的支持 大家好,

有人知道Go语言是否有计划正式支持WebAssembly(wasm)和syscall/js吗?

以下是该包顶部的注释:

syscall/js
// Package js gives access to the WebAssembly host environment when using the js/wasm architecture.
// Its API is based on JavaScript semantics.
//
// This package is EXPERIMENTAL. Its current scope is only to allow tests to run, but not yet to provide a
// comprehensive API for users. It is exempt from the Go compatibility promise.

我是Go语言的支持者,并且我认为WebAssembly前景广阔,希望能将其用于生产环境中的应用,而不仅仅是实验阶段。

此致


更多关于Golang官方对WASM的支持的实战教程也可以访问 https://www.itying.com/category-94-b0.html

2 回复

我不知道有任何关于未来支持 WebAssembly 的承诺。不过,我个人理解是,WebAssembly 目前是受支持的,并且将继续得到支持。只是 syscall/js 包的 API 不能保证稳定性,因此他们可能会重命名函数、增加/移除参数等等,但使用 WebAssembly 的能力不太可能消失。

更多关于Golang官方对WASM的支持的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


根据Go语言官方文档和发布动态,Go对WebAssembly的支持已经超越了实验阶段。syscall/js包虽然仍标记为"EXPERIMENTAL",但实际已具备生产可用性。以下是具体说明和示例:

当前支持状态

Go 1.11开始引入WASM支持,目前最新版本(Go 1.21+)已提供稳定的WASM编译能力。虽然syscall/js包仍保留实验性标记,但核心功能稳定,许多项目已用于生产环境。

基本使用示例

package main

import (
    "fmt"
    "syscall/js"
)

func main() {
    // 注册Go函数供JavaScript调用
    js.Global().Set("goAdd", js.FuncOf(add))
    
    // 从JavaScript获取DOM元素
    document := js.Global().Get("document")
    body := document.Call("getElementById", "app")
    
    // 创建并添加元素
    div := document.Call("createElement", "div")
    div.Set("innerHTML", "Go WASM loaded successfully")
    body.Call("appendChild", div)
    
    // 调用JavaScript函数
    js.Global().Call("console.log", "Go WASM initialized")
    
    // 保持程序运行
    select {}
}

// Go函数,可从JavaScript调用
func add(this js.Value, args []js.Value) interface{} {
    if len(args) < 2 {
        return 0
    }
    return args[0].Int() + args[1].Int()
}

编译为WASM

# 编译为WASM
GOOS=js GOARCH=wasm go build -o main.wasm main.go

# 需要配套的JavaScript支持文件
cp "$(go env GOROOT)/misc/wasm/wasm_exec.js" .

HTML加载示例

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <script src="wasm_exec.js"></script>
</head>
<body>
    <div id="app"></div>
    <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>

实际生产使用

许多项目已在生产中使用Go WASM:

  • TinyGo专门针对WASM优化
  • 多个Web游戏和图形应用
  • 前端工具链和编译器
  • 加密和数据处理库

性能考虑

对于性能敏感场景,建议:

  1. 减少Go与JavaScript的频繁互操作
  2. 使用TypedArray进行大数据传输
  3. 考虑使用wasm-ldflags="-s -w"减小体积

虽然官方文档仍保持谨慎,但Go的WASM支持已足够稳定用于生产环境。社区生态也在持续完善,有多个第三方库增强了WASM开发体验。

回到顶部