首页 > 后端开发 > 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学习者快速成长!