php小編小新很高興為您解答關于Go 1.21是否會包含通過WebAssembly托管HTTP的功能的問題。目前來說,Go 1.21版本還沒有正式發布,因此我們無法確定其中具體的功能。但是,根據我們對Go語言的了解,Go非常注重WebAssembly和網絡編程方面的發展,因此很有可能在未來的版本中加入通過WebAssembly托管HTTP的功能。這將為開發者提供更多靈活和高效的Web開發工具。我們建議您持續關注Go語言的官方發布信息,以獲取最新的更新和功能。
問題內容
我想在 go 上通過 webassembly 嘗試 http 服務器。我認為 go 1.20 不支持在瀏覽器之外編譯 go for web assembly,并且tinygo 中不包含 net/http 庫。
在閱讀https://stackoverflow.com/a/76091829(感謝@tachyonicbytes)后,我嘗試使用 gotip
來完成此操作,但是每當我嘗試啟動服務器(或任何阻塞/等待功能)時,我都會收到錯誤: 致命錯誤:所有 goroutine 都在睡覺 - 死鎖!
。我嘗試將事情轉移到帶有等待函數的 goroutine 中,但要么簡單地結束該函數,要么給出相同的錯誤。
這是我的運行方式:
go install golang.org/dl/gotip@latest gotip download goos=wasip1 goarch=wasm gotip build -o server.wasm server.go && wasm3 server.wasm
登錄后復制
這是示例 server.go
:
package main import ( "fmt" "net/http" "sync" ) func main() { s := http.Server{ Addr: ":8080", Handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.Write([]byte("Hello, World!")) }), } fmt.Println("about to serve") var wg sync.WaitGroup wg.Add(1) go func() { err := s.ListenAndServe() if err != nil { fmt.Printf("Unable to serve: %v\n", err) } wg.Done() fmt.Println("serving stopped") }() wg.Wait() fmt.Println("started up server") }
登錄后復制
那么,這僅僅是因為 go 1.21 是一個 wip,因為我無法理解啟動阻塞函數的正確方法,或者因為 go 1.21 不支持這種事情?
我嘗試在 intel mac 上的服務器端 webassembly 運行器 wasm3 中啟動 go 服務器。我期望它提供 http 服務,但發現它要么拋出錯誤,要么立即退出。
解決方法
很高興能為您提供幫助!
不幸的是,wasm 網絡似乎不會成為 go 1.21 的一部分。在 wasm 中實現網絡有點復雜。運行你的代碼,我得到了這一行:
sdk/gotip/src/net/net_fake.go:229
登錄后復制
經過檢查,它有以下免責聲明:
// Fake networking for js/wasm and wasip1/wasm. // This file only exists to make the compiler happy.
登錄后復制
這樣做的難點在于 wasi 僅對套接字提供部分支持,因此 wasi 還沒有完整的 berkeley 套接字。
好消息是你實際上可以做http,但是在tinygo中。 tinygo 對 go net/http
軟件包提供部分支持,其驅動程序.
如果你想看看它的一些實際用法,我目前正在嘗試移植這個 使用tinygo 項目到wasm。如果我沒記錯的話,我已經讓它工作了,但已經有一段時間了,我確信我還沒有完成轉換。也許暫時不可能。
另一件事是 wasm3
盡管有部分 wasi 實現,但可能沒有實現套接字部分。我建議也使用一些其他運行時,例如 @gedw99 建議的 wasmtime、wasmer、wasmedge 或 wazero。 wasmedge 對套接字有很好的支持,但就您而言,編譯器是實際上是問題所在。