首頁 > 後端開發 > Golang > 主體

Go 1.21 會包含透過 WebAssembly 託管 http 的功能嗎?如何?

王林
發布: 2024-02-09 23:20:25
轉載
1110 人瀏覽過

Go 1.21 会包含通过 WebAssembly 托管 http 的功能吗?如何?

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中文網其他相關文章!

來源:stackoverflow.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!