最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

golang語言中wasm 環(huán)境搭建的過程詳解

 更新時間:2021年11月09日 16:46:54   作者:shushushu  
將 golang 打包為 WASM,通常有兩種打包方式,一種是 golang 自帶的,另外是使用 tinygo ,接下來通過本文給大家介紹golang語言中wasm 環(huán)境搭建的過程,感興趣的朋友一起看看吧

golang 安裝

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

$ brew install golang

$ go version
go version go1.17.2 darwin/arm64

golang 環(huán)境測試

新建文件 main.go ,寫入:

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è)置 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)

使用以下命令對 main.go 再次進(jìn)行打包:

$ tinygo build -o main-tiny.wasm

  • 打包文件大小對比
$ du -sh ./*.wasm
228K    ./main-tiny.wasm
1.9M    ./main.wasm

在瀏覽器中跑起來

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

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

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

其次,需要一個 HTML 入口文件,創(chuàng)建 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); // 執(zhí)行 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 起的服務(wù),加載會報(bào)錯:

> 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語言中wasm 環(huán)境搭建的文章就介紹到這了,更多相關(guān)golang wasm 環(huán)境搭建內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • golang中隨機(jī)數(shù)rand的使用

    golang中隨機(jī)數(shù)rand的使用

    本文主要介紹了golang中隨機(jī)數(shù)rand的使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • Golang實(shí)現(xiàn)smtp郵件發(fā)送的示例代碼

    Golang實(shí)現(xiàn)smtp郵件發(fā)送的示例代碼

    這篇文章主要為大家詳細(xì)介紹了Golang實(shí)現(xiàn)smtp郵件發(fā)送的相關(guān)知識,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • Go語言中函數(shù)可變參數(shù)(Variadic Parameter)詳解

    Go語言中函數(shù)可變參數(shù)(Variadic Parameter)詳解

    在Python中,在函數(shù)參數(shù)不確定數(shù)量的情況下,可以動態(tài)在函數(shù)內(nèi)獲取參數(shù)。在Go語言中,也有類似的實(shí)現(xiàn)方式,本文就來為大家詳細(xì)講解一下
    2022-07-07
  • go語言入門環(huán)境搭建及GoLand安裝教程詳解

    go語言入門環(huán)境搭建及GoLand安裝教程詳解

    這篇文章主要介紹了go語言入門環(huán)境搭建及GoLand安裝教程詳解,需要的朋友可以參考下
    2020-12-12
  • Go語言的匿名字段實(shí)現(xiàn)組合復(fù)用實(shí)例探究

    Go語言的匿名字段實(shí)現(xiàn)組合復(fù)用實(shí)例探究

    這篇文章主要為大家介紹了Go語言的匿名字段實(shí)現(xiàn)組合復(fù)用實(shí)例探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2024-01-01
  • Go語言構(gòu)建流數(shù)據(jù)pipeline的示例詳解

    Go語言構(gòu)建流數(shù)據(jù)pipeline的示例詳解

    Go的并發(fā)原語可以輕松構(gòu)建流數(shù)據(jù)管道,從而高效利用?I/O?和多個?CPU,?本文展示了此類pipelines的示例,強(qiáng)調(diào)了操作失敗時出現(xiàn)的細(xì)微之處,并介紹了干凈地處理失敗的技術(shù),希望對大家有所幫助
    2024-02-02
  • Golang程序如何查找內(nèi)存泄漏(pprof)

    Golang程序如何查找內(nèi)存泄漏(pprof)

    該文章詳細(xì)介紹了如何使用Golang的pprof工具查找內(nèi)存泄漏,首先,在main包中引入pprof包并設(shè)置條件編譯,然后編譯程序并運(yùn)行,通過執(zhí)行g(shù)otoolpprof-inuse_space命令,可以進(jìn)入交互模式并使用top命令查看內(nèi)存分配最多的函數(shù),如果本機(jī)中有源代碼
    2024-12-12
  • Go內(nèi)存分配之結(jié)構(gòu)體優(yōu)化技巧

    Go內(nèi)存分配之結(jié)構(gòu)體優(yōu)化技巧

    這篇文章主要為大家詳細(xì)介紹了Go語言內(nèi)存分配之結(jié)構(gòu)體優(yōu)化技巧的相關(guān)知識,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-11-11
  • Golang三個編譯基本命令的使用小結(jié)

    Golang三個編譯基本命令的使用小結(jié)

    本文主要介紹了Golang三個編譯基本命令的使用小結(jié),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • go run main.go 一直提示找不到包的解決方案

    go run main.go 一直提示找不到包的解決方案

    這篇文章主要介紹了go run main.go 一直提示找不到包的解決方案,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04

最新評論

拜城县| 泸西县| 西盟| 界首市| 景宁| 东平县| 峨眉山市| 太白县| 漠河县| 桐庐县| 铅山县| 万载县| 宁都县| 左贡县| 蒲江县| 都江堰市| 高邮市| 高尔夫| 班戈县| 平阴县| 固原市| 太仓市| 临沧市| 法库县| 四川省| 萝北县| 个旧市| 柳林县| 郑州市| 稻城县| 沙雅县| 循化| 班戈县| 新巴尔虎左旗| 荥阳市| 昭通市| 调兵山市| 资阳市| 万山特区| 北安市| 高青县|