🌷🍁 博主貓頭虎(🐅🐾)帶您 Go to New World?🍁
🦄 博客首頁——🐅🐾貓頭虎的博客🎐
🐳 《面試題大全專欄》 🦕 文章圖文并茂🦖生動形象🐅簡單易學!歡迎大家來踩踩~🌺
🌊 《IDEA開發秘籍專欄》 🐾 學會IDEA常用操作,工作效率翻倍~💐
🌊 《100天精通Golang(基礎入門篇)》 🐅 學會Golang語言,暢玩云原生,走遍大小廠~💐
🐅🐾貓頭虎建議Go程序員必備技術棧一覽表📖:
??🐳
Go語言開發者必備技術棧??
:
🐹 GoLang | 🌿 Git | 🐳 Docker | ?? Kubernetes | 🔧 CI/CD | ? Testing | 💾 SQL/NoSQL | 📡 gRPC | ?? Cloud | 📊 Prometheus | 📚 ELK Stack
🪁🍁 希望本文能夠給您帶來一定的幫助🌸文章粗淺,敬請批評指正!🐅🐾🍁🐥
文章目錄
- 🐅🐾貓頭虎建議Go程序員必備技術棧一覽表📖:
- 2023年9月13日 Go生態洞察:WASI支持在Go中的實現 🌐
- 摘要
- 引言
- 正文
- 🚀 WebAssembly簡介
- 🛠? WebAssembly System Interface(WASI)
- 🌟 Go中的WASI使用方法
- 🧪 使用wasip1運行go測試
- 📦 使用go:wasmimport包裝Wasm函數
- 🚧 限制
- 🔮 Go中Wasm的未來
- 🌟 參與其中
- 總結
- 參考資料
- 下一篇預告
- 原創聲明
-
原創作者: 貓頭虎
-
作者wx: Libin9iOak
-
作者公眾號: 貓頭虎技術團隊
2023年9月13日 Go生態洞察:WASI支持在Go中的實現 🌐
摘要
🐯 貓頭虎博主在此,帶大家一起探索Go語言的新天地!在本篇博客中,我們將深入研究Go 1.21版本如何通過WASI syscall API為WebAssembly提供支持。準備好,一起在Go的世界中沖浪吧!不要忘記,搜索“Go WASI”可以發現更多精彩內容!
引言
自從Go 1.11引入對WebAssembly的支持以來,Go語言與Wasm的結合愈發緊密。如今,Go 1.21版在這一領域又邁出了新步伐,引入了針對WASI preview 1 syscall API的新端口wasip1
。讓我們一探究竟,看看Go如何利用WASI,進一步擴展其WebAssembly的能力。
正文
🚀 WebAssembly簡介
WebAssembly(Wasm)最初為Web設計,是一種二進制指令格式,能夠讓開發者在瀏覽器中以接近原生速度運行高性能、低層次的代碼。Go在1.11版本首次加入了對Wasm的編譯支持,通過js/wasm
端口實現。
🛠? WebAssembly System Interface(WASI)
WASI為Wasm可執行文件定義了一個syscall API,允許它們與文件系統、系統時鐘、隨機數據工具等系統資源進行交互。WASI的最新版本被稱為wasi_snapshot_preview1
,Go中相應的GOOS
值為wasip1
。隨著API的不斷發展,Go未來可能會添加新的GOOS
以支持它們。
🌟 Go中的WASI使用方法
要在Go中使用WASI,首先確保安裝了至少1.21版本的Go。在本示例中,我們使用Wasmtime作為宿主運行我們的二進制文件。首先,我們有一個簡單的main.go
:
package mainimport "fmt"func main() {fmt.Println("Hello world!")
}
我們可以使用以下命令為wasip1
構建它:
$ GOOS=wasip1 GOARCH=wasm go build -o main.wasm main.go
然后,使用wasmtime
執行生成的文件:
$ wasmtime main.wasm
Hello world!
🧪 使用wasip1運行go測試
除了構建和運行二進制文件外,我們還希望能夠直接運行go test
。通過將misc/wasm
目錄添加到您的PATH
中,可以使用所選的Wasm宿主運行測試。這是通過go test
在PATH
中找到misc/wasm/go_wasip1_wasm_exec
文件時自動執行它來實現的。
$ export PATH=$PATH:$(go env GOROOT)/misc/wasm
$ GOOS=wasip1 GOARCH=wasm go test ./...
📦 使用go:wasmimport包裝Wasm函數
Go 1.21還引入了一種新的編譯器指令:go:wasmimport
。這使我們能夠將對注釋函數的調用轉換為對宿主模塊名稱和函數名稱指定的函數的調用。例如,wasip1 syscall API定義了random_get
函數,并通過Go標準庫中定義的函數包裝器暴露給Go標準庫。
🚧 限制
Wasm是單線程架構,沒有并行性。
在Wasm中,wasip1
API缺少對網絡套接字的完整實現,這是Go標準庫中一些最受歡迎功能的重要組成部分。
🔮 Go中Wasm的未來
wasip1/wasm
端口的添加只是我們希望為Go帶來的Wasm能力的開始。請關注相關的議題跟蹤器,了解更多關于在Wasm中導出Go函數(go:wasmexport
)、32位端口和未來WASI API兼容性的提案。
🌟 參與其中
如果您正在嘗試Wasm和Go并希望做出貢獻,請參與進來!Go問題跟蹤器跟蹤所有正在進行的工作,Gophers Slack上的#webassembly頻道是討論Go和WebAssembly的好地方。
總結
本文被貓頭虎的Go生態洞察專欄收錄,詳情點擊這里。我們深入探討了Go 1.21如何通過新端口wasip1
支持WASI,這是Go在WebAssembly領域的一大步。希望你們喜歡這次的探索旅程!
參考資料
- WebAssembly 官網
- WASI 官網
- Wasmtime
- Go語言議題跟蹤器
下一篇預告
🐯 貓頭虎博主下一篇要帶大家深入了解“Go 1.22中循環修正的細節”。敬請期待,我們將探索Go 1.22中對循環機制的改進及其對編程實踐的影響!�
原創聲明
======= ·
-
原創作者: 貓頭虎
-
作者wx: Libin9iOak
-
作者公眾號: 貓頭虎技術團隊
學習 | 復習 | Go生態 |
---|---|---|
? | ? | ? |
本文為原創文章,版權歸作者所有。未經許可,禁止轉載、復制或引用。
作者保證信息真實可靠,但不對準確性和完整性承擔責任。
未經許可,禁止商業用途。
如有疑問或建議,請聯系作者。
感謝您的支持與尊重。
點擊
下方名片
,加入IT技術核心學習團隊。一起探索科技的未來,洞察Go生態,共同成長。