golang語(yǔ)言中wasm 環(huán)境搭建的過(guò)程詳解
golang 安裝
通過(guò)官方地址 下載。MacOS 也可通過(guò) brew 快速安裝:
$ brew install golang $ go version go version go1.17.2 darwin/arm64
golang 環(huán)境測(cè)試
新建文件 main.go ,寫(xiě)入:
package main
import "fmt"
func main() {
fmt.Println("Hello World!")
}
執(zhí)行 go run main.go ,將輸出:
$ go run main.go
Hello World!
如果啟用了 GO MODULES ,則需要使用 go mode init 初始化模塊,或設(shè)置 GO111MODULE=auto 。
將 golang 打包為 WASM
通常有兩種打包方式,一種是 golang 自帶的,另外是使用 tinygo 。推薦使用 tinygo ,因?yàn)榫幾g出的 wasm 模塊更小。
- 使用 golang 原生編譯
在編譯 wasm 模塊前,需要設(shè)置 golang 交叉編譯參數(shù),目標(biāo)系統(tǒng) GOOS=js 和目標(biāo)架構(gòu) GOARCH=wasm ,編譯 wasm 模塊:
// macos $ GOOS=js GOARCH=wasm go build -o main.wasm // windows 臨時(shí)設(shè)置 golang 環(huán)境參數(shù)(僅作用于當(dāng)前CMD) $ set GOOS=js $ set GOARCH=wasm $ go build -o main.wasm
- 使用 tinygo 編譯
直接按照官方文檔安裝即可,MacOS 如下:
$ brew tap tinygo-org/tools $ brew install tinygo $ tinygo version tinygo version 0.20.0 darwin/amd64 (using go version go1.17.2 and LLVM version 11.0.0)
使用以下命令對(duì) main.go 再次進(jìn)行打包:
$ tinygo build -o main-tiny.wasm
- 打包文件大小對(duì)比
$ du -sh ./*.wasm 228K ./main-tiny.wasm 1.9M ./main.wasm
在瀏覽器中跑起來(lái)
要想在瀏覽器中跑 main.wasm ,首先需要 JS 膠水代碼,golang 已經(jīng)為我們提供了,直接復(fù)制過(guò)來(lái)。需要注意的是,使用 tinygo 和 原生編譯的膠水代碼是有差異的,根據(jù)具體情況拷貝對(duì)應(yīng)的:
// 原生編譯 $ cp "$(go env GOROOT)/misc/wasm/wasm_exec.js" . // tinygo編譯 $ cp "$(tinygo env TINYGOROOT)/targets/wasm_exec.js" ./wasm_exec_tiny.js
其次,需要一個(gè) HTML 入口文件,創(chuàng)建 index.html 文件,并寫(xiě)入以下代碼:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="./wasm_exec_tiny.js"></script>
</head>
<body>
<script>
const go = new Go(); // wasm_exec.js 中的定義
WebAssembly.instantiateStreaming(fetch('./main-tiny.wasm'), go.importObject)
.then(res => {
go.run(res.instance); // 執(zhí)行 go main 方法
});
</script>
</body>
</html>
最后,起一個(gè) http server 讓它跑起來(lái)吧~
// python $ python3 -m http.server $ python2 -m SimpleHTTPServer // node $ npm i -g http-server $ hs // gp $ go get -u github.com/shurcooL/goexec $ goexec 'http.ListenAndServe(`:8080`, http.FileServer(http.Dir(`.`)))'
異常記錄
- 通過(guò) node 的 http-server 起的服務(wù),加載會(huì)報(bào)錯(cuò):
> TypeError: Failed to execute 'compile' on 'WebAssembly': Incorrect response MIME type. Expected 'application/wasm'.
原因是 wasm 文件響應(yīng)頭的 content-type 為 application/wasm; charset=utf-8 ,應(yīng)該為 application/wasm 。已知的解決方法為修改 HTML 中 wasm 的初始化方式為:
fetch('./main-tiny.wasm')
.then(res => res.arrayBuffer())
.then(buffer => {
WebAssembly.instantiate(buffer, go.importObject)
.then(res => {
go.run(res.instance);
})
})
到此這篇關(guān)于golang語(yǔ)言中wasm 環(huán)境搭建的文章就介紹到這了,更多相關(guān)golang wasm 環(huán)境搭建內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Golang實(shí)現(xiàn)smtp郵件發(fā)送的示例代碼
這篇文章主要為大家詳細(xì)介紹了Golang實(shí)現(xiàn)smtp郵件發(fā)送的相關(guān)知識(shí),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03
Go語(yǔ)言中函數(shù)可變參數(shù)(Variadic Parameter)詳解
在Python中,在函數(shù)參數(shù)不確定數(shù)量的情況下,可以動(dòng)態(tài)在函數(shù)內(nèi)獲取參數(shù)。在Go語(yǔ)言中,也有類(lèi)似的實(shí)現(xiàn)方式,本文就來(lái)為大家詳細(xì)講解一下2022-07-07
go語(yǔ)言入門(mén)環(huán)境搭建及GoLand安裝教程詳解
這篇文章主要介紹了go語(yǔ)言入門(mén)環(huán)境搭建及GoLand安裝教程詳解,需要的朋友可以參考下2020-12-12
Go語(yǔ)言的匿名字段實(shí)現(xiàn)組合復(fù)用實(shí)例探究
這篇文章主要為大家介紹了Go語(yǔ)言的匿名字段實(shí)現(xiàn)組合復(fù)用實(shí)例探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01
Go語(yǔ)言構(gòu)建流數(shù)據(jù)pipeline的示例詳解
Go的并發(fā)原語(yǔ)可以輕松構(gòu)建流數(shù)據(jù)管道,從而高效利用?I/O?和多個(gè)?CPU,?本文展示了此類(lèi)pipelines的示例,強(qiáng)調(diào)了操作失敗時(shí)出現(xiàn)的細(xì)微之處,并介紹了干凈地處理失敗的技術(shù),希望對(duì)大家有所幫助2024-02-02
Go內(nèi)存分配之結(jié)構(gòu)體優(yōu)化技巧
這篇文章主要為大家詳細(xì)介紹了Go語(yǔ)言?xún)?nèi)存分配之結(jié)構(gòu)體優(yōu)化技巧的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-11-11

