使用Golang来探索WebAssembly

这是马克罗大学(近畿大学)Advent Calendar第16天的文章。

由于时间紧迫,我没有按照原计划写文章,这篇作品与最初计划的不同。

Web Assembly是什么?

在现代浏览器中,有一种技术可以运行机器码以实现加速。
据说大多数现代浏览器都支持该技术。
可以将用C或Rust编写的代码编译成Web Assembly的二进制文件并使用。
Go语言从1.11版本开始支持该技术。

教程

在浏览器控制台中输出文本。

package main

import "fmt"

func main() {
    fmt.Println("Hello wasm!")
}

将其编译成.wasm文件。

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

我将获取用于加载.wasm文件的HTML和JavaScript代码。

curl -sO https://raw.githubusercontent.com/golang/go/master/misc/wasm/wasm_exec.html
curl -sO https://raw.githubusercontent.com/golang/go/master/misc/wasm/wasm_exec.js

建立一个简易的Web服务器。

package main

import (
    "flag"
    "log"
    "net/http"
)

var (
    listen = flag.String("listen", ":8080", "listen address")
    dir    = flag.String("dir", ".", "directory to serve")
)

func main() {
    flag.Parse()
    log.Printf("listening on %q...", *listen)
    log.Fatal(http.ListenAndServe(*listen, http.FileServer(http.Dir(*dir))))
}

启动服务器。

go run server.go

如果访问 localhost:8080/wasm_exec.html 并点击运行按钮,在控制台中显示“Hello wasm”即表示成功。如果出现“Uncaught (in promise) LinkError: WebAssembly Instantiation: Import #5 module=”go” function=”runtime.scheduleCallback” error: function import requires a callable” 的错误提示,尝试将js文件替换为 https://raw.githubusercontent.com/golang/go/release-branch.go1.11/misc/wasm/wasm_exec.js ,或许可以解决问题。

DOM操作的中文释义是文档对象模型操作。

使用syscall/js来接触Go和JavaScript。

import "syscall/js"

获取document对象

document := js.Global().Get("document")

调用document的getElementById(“text”)方法。

element := document.Call("getElementById", "text")

获取innerText的值

text := element.Get("innerText").String()

在innerText中设置值。

element.Set("innerText", "Hello World")

以下是您的参考:

进行WebAssembly教程 – 构建计算器教程 | TutorialEdge.net
js – Go编程语言
misc/wasm:this._inst.exports.getsp不是一个函数 · 问题 #28924 · golang/go
尝试快速转换Go到WebAssembly – Qiita

广告
将在 10 秒后关闭
bannerAds