WebAssembly - 使用 Go 语言进行开发
你好,未来的编程巨星们!今天,我们将踏上一段激动人心的旅程,使用 Go 语言探索 WebAssembly 的世界。别担心,如果这些术语现在听起来像外星语言 - 到了这个教程结束时,你会流利地使用它们的!
什么是 WebAssembly?
在我们深入代码之前,让我们了解一下 WebAssembly 是什么。想象你有一辆超级快速的赛车(那就是 WebAssembly),它能在任何赛道(网页浏览器)上以惊人的速度行驶。它是一种运行用 Go、C++ 或 Rust 等语言编写的程序直接在网页浏览器中的方式,使得网页应用更快、更强大。
为什么选择 WebAssembly 中的 Go?
今天我们选择的 Go 语言,就像是编程世界中的瑞士军刀。它简单、高效,而且现在多亏了 WebAssembly,它还能在网页浏览器中运行。这就好比给你的网页应用赋予了超能力!
设置我们的 Go 开发环境
首先,我们需要设置我们的 Go 开发环境。这就像在我们开始烹饪美味佳肴前准备厨房一样。
- 从官方网站(https://golang.org/)安装 Go
- 设置你的 GOPATH(安装过程中 Go 会引导你完成这一步)
- 安装一个代码编辑器(我推荐 Visual Studio Code,但你可以使用任何你习惯的编辑器)
我们的第一个 Go WebAssembly 程序
让我们从一个简单的 "Hello, WebAssembly!" 程序开始。别担心如果你现在还不理解所有内容 - 我们会一步一步地分解。
package main
import (
"fmt"
"syscall/js"
)
func main() {
fmt.Println("Hello, WebAssembly!")
js.Global().Set("greet", js.FuncOf(greet))
<-make(chan bool)
}
func greet(this js.Value, args []js.Value) interface{} {
name := args[0].String()
message := fmt.Sprintf("你好,%s!欢迎来到 WebAssembly。", name)
js.Global().Get("document").Call("getElementById", "greeting").Set("innerText", message)
return nil
}
让我们分解一下:
-
package main
:这告诉 Go 这是我们的程序的主包。 -
import
:我们导入了两个包 -fmt
用于打印,syscall/js
用于与 JavaScript 交互。 -
func main()
:这是我们的程序的入口点。 -
js.Global().Set("greet", js.FuncOf(greet))
:这使得我们的greet
函数对 JavaScript 可用。 -
<-make(chan bool)
:这使我们的程序保持运行,等待 JavaScript 的调用。 -
func greet
:这个函数接收一个名字,并更新一个 HTML 元素以显示问候。
将我们的 Go 程序编译为 WebAssembly
现在,让我们将我们的 Go 代码转换为 WebAssembly。打开你的终端并运行:
GOOS=js GOARCH=wasm go build -o main.wasm
这个命令告诉 Go 为 JavaScript(GOOS=js)和 WebAssembly(GOARCH=wasm)编译我们的程序。
创建一个 HTML 页面来运行我们的 WebAssembly
我们需要一个 HTML 页面来加载并运行我们的 WebAssembly。这是一个简单的例子:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Go WebAssembly</title>
</head>
<body>
<h1>Go WebAssembly 演示</h1>
<input id="name" type="text" placeholder="输入你的名字">
<button onclick="greet(document.getElementById('name').value)">问候</button>
<p id="greeting"></p>
<script src="wasm_exec.js"></script>
<script>
const go = new Go();
WebAssembly.instantiateStreaming(fetch("main.wasm"), go.importObject).then((result) => {
go.run(result.instance);
});
</script>
</body>
</html>
这个 HTML 文件:
- 创建了一个输入字段来输入名字
- 有一个按钮,点击时会调用我们的
greet
函数 - 加载了 WebAssembly 运行时(
wasm_exec.js
) - 加载并运行我们的 WebAssembly 文件(
main.wasm
)
运行我们的 WebAssembly 应用
为了运行这个应用,我们需要一个网页服务器。这里有一个简单的 Python 命令来启动一个:
python -m http.server
现在,打开你的浏览器并访问 http://localhost:8000
。你应该能看到我们的页面!
理解输出
当你输入你的名字并点击 "问候" 时,你会看到个性化的问候出现。这是我们的 Go 函数在浏览器中运行,多亏了 WebAssembly!
结论
恭喜你!你刚刚创建了你的第一个 Go WebAssembly 应用。我们在这里只是浅尝辄止,但我希望这激发了你的好奇心,去探索更多。
记住,学习编程就像学习一门新语言或乐器。它需要练习、耐心和毅力。但随着每一步,你都在解锁新的可能性,扩展你的创造潜力。
继续编码,继续探索,最重要的是,享受乐趣!
方法 | 描述 |
---|---|
js.Global() |
访问全局 JavaScript 对象 |
js.FuncOf() |
将 Go 函数转换为 JavaScript 函数 |
js.Value |
表示一个 JavaScript 值 |
Call() |
调用一个 JavaScript 方法 |
Set() |
设置一个 JavaScript 属性 |
Get() |
获取一个 JavaScript 属性 |
String() |
将一个 JavaScript 值转换为 Go 字符串 |
这个表格总结了我们用来在 Go 和 JavaScript 之间交互的关键方法。在你继续你的 WebAssembly 之旅时,你会发现这些方法非常有用!
Credits: Image by storyset