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: %vn", 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 的功能吗?如何?的详细内容,更多请关注每日运维网(www.mryunwei.com)其它相关文章!