Maison > développement back-end > Golang > le corps du texte

Go 1.21 inclura-t-il la possibilité d'héberger http via WebAssembly ? comment ?

王林
Libérer: 2024-02-09 23:20:25
avant
1110 Les gens l'ont consulté

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

L'éditeur php Xiaoxin est heureux de répondre à votre question de savoir si Go 1.21 inclura la possibilité d'héberger HTTP via WebAssembly. Actuellement, la version Go 1.21 n’a pas été officiellement publiée, nous ne pouvons donc pas déterminer ses fonctionnalités spécifiques. Cependant, d'après ce que nous savons du langage Go, Go est très axé sur le développement de WebAssembly et la programmation réseau, il est donc très probable que la fonction d'hébergement HTTP via WebAssembly soit ajoutée dans une future version. Cela fournira aux développeurs des outils de développement Web plus flexibles et plus efficaces. Nous vous recommandons de continuer à prêter attention aux informations de version officielle du langage Go pour obtenir les dernières mises à jour et fonctionnalités.

Contenu de la question

Je souhaite essayer le serveur http via webassembly en déplacement. Je pense que go 1.20 ne prend pas en charge la compilation de go pour l'assemblage Web en dehors du navigateur, et la bibliothèque net/http n'est pas incluse dans tinygo.

Après avoir lu https://stackoverflow.com/a/76091829 (merci à @tachyonicbytes) j'ai essayé d'utiliser gotip 来完成此操作,但是每当我尝试启动服务器(或任何阻塞/等待功能)时,我都会收到错误: 致命错误:所有 goroutine 都在睡觉 - 死锁!. J'ai essayé de déplacer des éléments dans une goroutine avec une fonction d'attente, mais cela termine simplement la fonction ou donne la même erreur. Voici comment je le gère :

go install golang.org/dl/gotip@latest
gotip download
goos=wasip1 goarch=wasm gotip build -o server.wasm server.go && wasm3 server.wasm
Copier après la connexion

Ceci est un exemple 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")
}
Copier après la connexion

Alors, est-ce simplement parce que go 1.21 est un wip, parce que je ne comprends pas la bonne façon de lancer une fonction de blocage, ou parce que go 1.21 ne prend pas en charge une telle chose ?

J'essaie de démarrer un serveur Go dans le runner webassembly côté serveur wasm3 sur un Mac Intel. Je m'attendais à ce qu'il fournisse un service http, mais j'ai constaté qu'il provoquait une erreur ou se terminait immédiatement.

Solution

Heureux de vous aider !

Malheureusement, il ne semble pas que wasm networking fera partie de go 1.21. La mise en œuvre du réseau dans wasm est un peu compliquée. En exécutant votre code, j'ai obtenu cette ligne :

sdk/gotip/src/net/net_fake.go:229
Copier après la connexion

Après Inspection, il comporte l'avertissement suivant :

// Fake networking for js/wasm and wasip1/wasm.
// This file only exists to make the compiler happy.
Copier après la connexion

La difficulté est que wasi ne fournit qu'un support partiel pour les sockets, donc wasi n'a pas encore de socket Berkeley complet.

La bonne nouvelle est que vous pouvez réellement faire du http, mais en tinygo. tinygo fournit un support partiel pour le package go net/http avec son driver.

Si vous voulez en voir quelques utilisations pratiques, j'essaie actuellement de porter ce en utilisant le projet tinygo vers wasm. Si je me souviens bien, cela fonctionne, mais cela fait un moment et je suis sûr que je n'ai pas encore terminé la conversion. Ce n'est peut-être pas possible pour le moment.

Une autre chose est wasm3 Bien qu'il existe une implémentation partielle de wasi, la partie socket peut ne pas être implémentée. Je recommande également d'utiliser d'autres environnements d'exécution, tels que wasmtime, wasmer, wasmedge ou wazero, comme l'a suggéré @gedw99. wasmedge offre un excellent support pour les sockets, mais dans votre cas, le compilateur est en fait le problème.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!