Adakah Go 1.21 akan menyertakan keupayaan untuk mengehoskan http melalui WebAssembly? bagaimana?

王林
Lepaskan: 2024-02-09 23:20:25
ke hadapan
1110 orang telah melayarinya

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

editor php Xiaoxin berbesar hati untuk menjawab soalan anda tentang sama ada Go 1.21 akan menyertakan keupayaan untuk mengehoskan HTTP melalui WebAssembly. Pada masa ini, versi Go 1.21 belum dikeluarkan secara rasmi, jadi kami tidak dapat menentukan ciri khususnya. Walau bagaimanapun, berdasarkan apa yang kami ketahui tentang bahasa Go, Go sangat tertumpu pada pembangunan WebAssembly dan pengaturcaraan rangkaian, jadi kemungkinan besar fungsi pengehosan HTTP melalui WebAssembly akan ditambah dalam versi akan datang. Ini akan menyediakan pembangun alat pembangunan web yang lebih fleksibel dan cekap. Kami mengesyorkan agar anda terus memberi perhatian kepada maklumat keluaran rasmi bahasa Go untuk mendapatkan kemas kini dan ciri terkini.

Kandungan soalan

Saya ingin mencuba pelayan http melalui pemasangan web semasa dalam perjalanan. Saya rasa go 1.20 tidak menyokong kompilasi go untuk pemasangan web di luar penyemak imbas, dan perpustakaan net/http tidak disertakan dalam tinygo.

Selepas membaca https://stackoverflow.com/a/76091829 (terima kasih kepada @tachyonicbytes) saya cuba menggunakan gotip 来完成此操作,但是每当我尝试启动服务器(或任何阻塞/等待功能)时,我都会收到错误: 致命错误:所有 goroutine 都在睡觉 - 死锁!. Saya cuba mengalihkan sesuatu ke dalam goroutine dengan fungsi await, tetapi itu sama ada hanya menamatkan fungsi atau memberikan ralat yang sama. Begini cara saya menjalankannya:

go install golang.org/dl/gotip@latest
gotip download
goos=wasip1 goarch=wasm gotip build -o server.wasm server.go && wasm3 server.wasm
Salin selepas log masuk

Ini adalah contoh 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")
}
Salin selepas log masuk

Jadi, adakah ini hanya kerana go 1.21 ialah wip, kerana saya tidak dapat memahami cara yang betul untuk memulakan fungsi menyekat, atau kerana go 1.21 tidak menyokong perkara sedemikian?

Saya cuba memulakan pelayan go di sisi pelayan webassembly runner wasm3 pada intel mac. Saya menjangkakan ia akan menyediakan perkhidmatan http, tetapi mendapati ia sama ada melemparkan ralat atau keluar serta-merta.

Penyelesaian

Sukacita membantu!

Malangnya ia tidak kelihatan seperti rangkaian wasm akan menjadi sebahagian daripada go 1.21. Melaksanakan rangkaian dalam wasm agak rumit. Menjalankan kod anda, saya mendapat baris ini:

sdk/gotip/src/net/net_fake.go:229
Salin selepas log masuk

Selepas Pemeriksaan, ia mempunyai penafian berikut:

// Fake networking for js/wasm and wasip1/wasm.
// This file only exists to make the compiler happy.
Salin selepas log masuk

Kesukarannya wasi hanya menyediakan sebahagian sokongan untuk soket, jadi wasi belum mempunyai soket berkeley yang lengkap.

Berita baiknya ialah anda sebenarnya boleh melakukan http, tetapi dalam tinygo. tinygo menyediakan sokongan separa untuk pakej perjalanan net/http dengan pemandunya.

Jika anda ingin melihat beberapa kegunaan praktikalnya, saya sedang cuba mengalihkan ini menggunakan projek tinygo ke wasm. Jika saya ingat dengan betul, saya telah berjaya melakukannya, tetapi sudah agak lama dan saya pasti saya belum menyelesaikan penukaran lagi. Mungkin tidak mungkin buat masa ini.

Seperkara lagi ialah wasm3 Walaupun terdapat pelaksanaan separa wasi, bahagian soket mungkin tidak dilaksanakan. Saya mengesyorkan menggunakan beberapa masa jalan lain juga, seperti wasmtime, wasmer, wasmedge atau wazero seperti yang dicadangkan @gedw99. wasmedge mempunyai sokongan yang hebat untuk soket, tetapi dalam kes anda pengkompil sebenarnya adalah masalahnya.

Atas ialah kandungan terperinci Adakah Go 1.21 akan menyertakan keupayaan untuk mengehoskan http melalui WebAssembly? bagaimana?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!