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 對套接字有很好的支持,但就您而言,編譯器是實際上是問題所在。
以上是Go 1.21 會包含透過 WebAssembly 託管 http 的功能嗎?如何?的詳細內容。更多資訊請關注PHP中文網其他相關文章!