中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

golang語言中wasm 環境搭建的過程是怎樣的

發布時間:2021-11-09 18:42:51 來源:億速云 閱讀:503 作者:柒染 欄目:開發技術

本篇文章為大家展示了golang語言中wasm 環境搭建的過程是怎樣的,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

golang 安裝

通過官方地址 下載。MacOS 也可通過 brew 快速安裝:

$ brew install golang

$ go version
go version go1.17.2 darwin/arm64

golang 環境測試

新建文件 main.go ,寫入:

package main

import "fmt"

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

執行 go run main.go ,將輸出:

$ go run main.go
Hello World!

如果啟用了 GO MODULES ,則需要使用 go mode init 初始化模塊,或設置 GO111MODULE=auto 。

將 golang 打包為 WASM

通常有兩種打包方式,一種是 golang 自帶的,另外是使用 tinygo 。推薦使用 tinygo ,因為編譯出的 wasm 模塊更小。

  • 使用 golang 原生編譯

在編譯 wasm 模塊前,需要設置 golang 交叉編譯參數,目標系統 GOOS=js 和目標架構 GOARCH=wasm ,編譯 wasm 模塊:

// macos
$ GOOS=js GOARCH=wasm go build -o main.wasm

// windows 臨時設置 golang 環境參數(僅作用于當前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)

使用以下命令對 main.go 再次進行打包:

$ tinygo build -o main-tiny.wasm

  • 打包文件大小對比

$ du -sh ./*.wasm
228K    ./main-tiny.wasm
1.9M    ./main.wasm

在瀏覽器中跑起來

要想在瀏覽器中跑 main.wasm ,首先需要 JS 膠水代碼,golang 已經為我們提供了,直接復制過來。需要注意的是,使用 tinygo 和 原生編譯的膠水代碼是有差異的,根據具體情況拷貝對應的:

// 原生編譯
$ cp "$(go env GOROOT)/misc/wasm/wasm_exec.js" .

// tinygo編譯
$ cp "$(tinygo env TINYGOROOT)/targets/wasm_exec.js" ./wasm_exec_tiny.js

其次,需要一個 HTML 入口文件,創建 index.html 文件,并寫入以下代碼:

<!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); // 執行 go main 方法
      });
  </script>
</body>
</html>

最后,起一個 http server 讓它跑起來吧~

// 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(`.`)))'

異常記錄

  • 通過 node 的 http-server 起的服務,加載會報錯:

> TypeError: Failed to execute 'compile' on 'WebAssembly': Incorrect response MIME type. Expected 'application/wasm'.

原因是 wasm 文件響應頭的 content-type 為 application/wasm; charset=utf-8 ,應該為 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);
      })
  })

上述內容就是golang語言中wasm 環境搭建的過程是怎樣的,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

偏关县| 民权县| 福泉市| 衡水市| 兴隆县| 孝义市| 灌阳县| 会昌县| 资讯| 四平市| 辰溪县| 石景山区| 云龙县| 精河县| 余干县| 信宜市| 三都| 方山县| 东海县| 东至县| 柘城县| 岐山县| 宕昌县| 大同县| 志丹县| 平果县| 徐汇区| 通州区| 确山县| 呼图壁县| 富民县| 本溪市| 曲水县| 南阳市| 桃园市| 定陶县| 宕昌县| 杨浦区| 永安市| 资中县| 长阳|