Gopherjs Compiles Go Code (Go.dev) zum reinen JavaScript -Code. Sein Hauptzweck ist es, Ihnen die Möglichkeit zu geben, Front-End-Code in Go zu schreiben, der in allen Browsern weiterhin ausgeführt wird.
syscall/js Paket-Implementierung kompatibel mit dem Upstream GO 1.16.Probieren Sie Gopherjs den Gopherjs -Spielplatz aus.
Fast alles, einschließlich Goroutinen (Kompatibilitätsdokumentation). Die Leistung ist in den meisten Fällen recht gut, siehe HTML5 Game Engine Benchmark. CGO wird nicht unterstützt.
Gopherjs benötigt GO 1.19 oder neuer. Wenn Sie eine ältere GO -Version benötigen, können Sie eine ältere Gopherjs -Version verwenden.
Installieren Sie Gopherjs mit go install :
go install github.com/gopherjs/[email protected] # Or replace 'v1.19.0-beta1' with another version.
Wenn Ihre von go version gemeldete lokale GO -Verteilung neuer als Go 1.19 ist, müssen Sie die GOPHERJS_GOROOT -Umgebungsvariable auf ein Verzeichnis festlegen, das eine GO 1.19 -Verteilung enthält. Zum Beispiel:
go install golang.org/dl/go1.19.13@latest
go1.19.13 download
export GOPHERJS_GOROOT="$(go1.19.13 env GOROOT)" # Also add this line to your .profile or equivalent.
Jetzt können Sie gopherjs build [package] , gopherjs build [files] oder gopherjs install [package] verwenden, die dem go -Tool ähnlich verhalten. Für main erstellen diese Befehle eine .js -Datei und .js.map -Quellkarte im aktuellen Verzeichnis oder in $GOPATH/bin . Die generierte JavaScript -Datei kann wie gewohnt in einer Website verwendet werden. Verwenden Sie gopherjs help [command] um eine Liste möglicher Befehlszeilenflags zu erhalten, z. B. für die Minifikation und automatisch nach Änderungen.
gopherjs verwendet den Standard GOOS -Wert Ihrer Plattform beim Generieren von Code. Unterstützte GOOS -Werte sind: linux , darwin . Wenn Sie sich auf einer anderen Plattform (z. B. Windows oder FreeBSD) befinden, müssen Sie die GOOS -Umgebungsvariable auf einen unterstützten Wert festlegen. Zum Beispiel GOOS=linux gopherjs build [package] .
Hinweis: Gopherjs versucht, kompilierte Objektdateien der Kernpakete in Ihr $ goroot/pkg -Verzeichnis zu schreiben. Wenn das fehlschlägt, fällt es auf $ gopath/pkg zurück.
Wenn Sie gopherjs run oder gopherjs test verwenden möchten, um den generierten Code lokal auszuführen, installieren Sie Node.js 18 (oder neuer).
Auf unterstützten GOOS -Plattformen ist es möglich, Systemanrufe (Dateisystemzugriff usw.) zur Verfügung zu stellen. Anweisungen dazu finden Sie unter doc/syscalls.md.
gopherjs serve ist ein nützlicher Befehl, den Sie während der Entwicklung verwenden können. Es startet einen HTTP -Server, der standardmäßig auf ": 8080" serviert wird, dann Ihre GO -Pakete dynamisch mit Gopherjs kompilieren und sie servieren.
Beispielsweise navigieren Sie zu http://localhost:8080/example.com/user/project/ sollte das go package example.com/user/project kompilieren und ausführen. Die generierte JavaScript -Ausgabe wird unter http://localhost:8080/example.com/user/project/project.js zugestellt (der Name .js Dateiname entspricht dem Namen des Basisverzeichnisses). Wenn das Verzeichnis index.html enthält, wird es bedient, andernfalls wird ein minimaler index.html , der <script src="project.js"></script> enthält, bereitgestellt, wodurch das JavaScript ausgeführt wird. Alle anderen statischen Dateien werden ebenfalls bedient.
Das Auffrischen im Browser wird die servierten Dateien bei Bedarf wieder aufbauen. Kompilierungsfehler werden im Terminal und in der Browserkonsole angezeigt. Darüber hinaus serviert es $ goroot und $ gopath für Sourcemaps.
Wenn Sie ein Argument einfügen, wird es die Wurzel sein, aus der alles serviert wird. Wenn Sie beispielsweise gopherjs serve github.com/user/project , das generierte JavaScript für das Paket github.com/user/project/mypkg wird unter http: // localhost: 8080/mypkg/mypkg.js serviert.
Es gibt einige Gopherjs-spezifische Umgebungsvariablen:
GOPHERJS_GOROOT - Wenn gesetzt, verwendet Gopherjs diesen Wert als Standard -Goroot -Wert, anstatt das System Goroot als Standard -Goroot -Wert zu verwendenGOPHERJS_SKIP_VERSION_CHECK - Wenn auf true eingestellt wird, überprüft Gopherjs die GO -Version im Goroot nicht auf Kompatibilität mit der Gopherjs -Veröffentlichung. Dies ist in erster Linie nützlich, um Gopherjs gegen unveröffentlichte Versionen von Go zu testen.-m , um Minimified Code zu generieren.int anstelle von (u)int8/16/32/64 .float64 anstelle von float32 . Das Paket github.com/gopherjs/gopherjs/js (siehe Dokumentation) bietet Funktionen für die Interaktion mit nativen JavaScript -APIs. Zum Beispiel die Linie
document . write ( "Hello world!" ) ;würde so in Go aussehen:
js . Global . Get ( "document" ). Call ( "write" , "Hello world!" )Möglicherweise möchten Sie auch die DOM -Bindungen, die JQuery -Bindungen (siehe Beispiele) oder die AngularJS -Bindungen verwenden. Dies sind einige der Bindungen an JavaScript -APIs und Bibliotheken von Community -Mitgliedern.
Legen Sie eine globale Variable auf eine Karte fest, die die Funktionen enthält:
package main
import "github.com/gopherjs/gopherjs/js"
func main () {
js . Global . Set ( "pet" , map [ string ] interface {}{
"New" : New ,
})
}
type Pet struct {
name string
}
func New ( name string ) * js. Object {
return js . MakeWrapper ( & Pet { name })
}
func ( p * Pet ) Name () string {
return p . name
}
func ( p * Pet ) SetName ( name string ) {
p . name = name
}Weitere Informationen finden Sie in Jason Stones Blog -Beitrag über Gopherjs.
Gopherjs emuliert eine 32-Bit-Umgebung. Dies bedeutet, dass int , uint und uintptr eine Präzision von 32 Bit haben. Die expliziten 64-Bit-Ganzzahltypen int64 und uint64 werden jedoch unterstützt.
Der GOOS -Wert dieser Umgebung lautet js und der GOARCH -Wert ist ecmascript . Sie können diese Werte in Build-Einschränkungen verwenden, wenn Sie plattformspezifischen Code schreiben. (Gopherjs 1.17 und älter verwendet js als GOARCH -Wert.)
Die main wird wie gewohnt ausgeführt, nachdem alle init -Funktionen ausgeführt wurden. JavaScript -Rückrufe können auch GO -Funktionen aufrufen, auch nachdem die main beendet wurde. Daher sollte das Ende der main nicht als Ende der Anwendung angesehen werden und beendet die Ausführung anderer Goroutinen nicht.
Im Browser beendet das Aufrufen os.Exit (z. B. indirekt von log.Fatal ) auch nicht die Ausführung des Programms. Aus Gründen der Bequemlichkeit ruft es runtime.Goexit an, um die Anrufgoroutine sofort zu beenden.
Goroutinen werden von Gopherjs vollständig unterstützt. Die einzige Einschränkung ist, dass Sie eine neue Goroutine starten müssen, wenn Sie den Blocking -Code aus dem externen JavaScript verwenden möchten:
js . Global . Get ( "myButton" ). Call ( "addEventListener" , "click" , func () {
go func () {
[ ... ]
someBlockingFunction ()
[ ... ]
}()
})Wie es funktioniert:
JavaScript hat kein Konzept der Parallelität (außer Web Workers, aber diese sind zu streng getrennt, um für Goroutinen verwendet zu werden). Aus diesem Grund blockieren Anweisungen in JavaScript nie. Ein Blockierungsanruf würde die Reaktionsfähigkeit Ihrer Webseite effektiv einfrieren, sodass stattdessen Anrufe mit Rückrufargumenten verwendet werden.
Gopherjs macht ein gewisses Maß an Heben, um diese Einschränkung zu bearbeiten: Immer wenn eine Anweisung blockiert (z. B. Kommunikation mit einem Kanal, der nicht fertig ist), wird sich der gesamte Stapel entspannt (= alle Funktionen kehren zurück) und die Goroutine wird eingeschlafen. Dann wird eine weitere Goroutine, die zum Lebenslauf bereit ist, ausgewählt und sein Stapel mit allen lokalen Variablen wird wiederhergestellt.
Wenn Sie Änderungen am Gopherjs -Compiler vornehmen möchten, finden Sie in den Entwicklerrichtlinien für zusätzliche Entwicklerinformationen.