Go-Frontend-Bridge
Direkte Go-JavaScript-Kommunikation
Abschnitt betitelt „Direkte Go-JavaScript-Kommunikation“Wails bietet eine direkte, im Speicher befindliche Brücke zwischen Go und JavaScript, die eine nahtlose Kommunikation ohne HTTP-Overhead, Prozessgrenzen oder Serialisierungsengpässe ermöglicht.
Das große Bild
Abschnitt betitelt „Das große Bild“Wichtige Erkenntnis: Kein HTTP, kein IPC, keine Prozessgrenzen. Nur direkte Funktionsaufrufe mit Typsicherheit.
Funktionsweise: Schritt für Schritt
Abschnitt betitelt „Funktionsweise: Schritt für Schritt“1. Dienstreistrierung (Start)
Abschnitt betitelt „1. Dienstreistrierung (Start)“Wenn Ihre Anwendung startet, scannt Wails Ihre Dienste:
type GreetService struct { prefix string}
func (g *GreetService) Greet(name string) string { return g.prefix + name + "!"}
func (g *GreetService) Add(a, b int) int { return a + b}
// Register serviceapp := application.New(application.Options{ Services: []application.Service{ application.NewService(&GreetService{prefix: "Hello, "}), },})Was Wails tut:
- Scannt die Struktur nach exportierten Methoden
- Extrahiert Typinformationen (Parameter, Rückgabetypen)
- Erstellt ein Verzeichnis, das Methodennamen Funktionen zuordnet
- Generiert TypeScript-Bindings mit vollständigen Typdefinitionen
2. Binding-Generierung (Build-Zeit)
Abschnitt betitelt „2. Binding-Generierung (Build-Zeit)“Wails generiert automatisch TypeScript-Bindings:
export function Greet(name: string): Promise<string>export function Add(a: number, b: number): Promise<number>Typzuordnung:
| Go-Typ | TypeScript-Typ |
|---|---|
string | string |
int, int32, int64 | number |
float32, float64 | number |
bool | boolean |
[]T | T[] |
map[string]T | Record<string, T> |
struct | interface |
time.Time | Date |
error | Exception (geworfen) |
3. Frontend-Aufruf (Laufzeit)
Abschnitt betitelt „3. Frontend-Aufruf (Laufzeit)“Der Entwickler ruft die Go-Methode aus JavaScript heraus auf:
import { Greet, Add } from './bindings/GreetService'
// Call Go from JavaScriptconst greeting = await Greet("World")console.log(greeting) // "Hello, World!"
const sum = await Add(5, 3)console.log(sum) // 8Was passiert:
- Binding-Funktion aufgerufen -
Greet("World") - Nachricht erstellt -
{ service: "GreetService", method: "Greet", args: ["World"] } - An die Brücke gesendet - Über die JavaScript-Brücke von WebView
- Promise zurückgegeben - Wartet auf Antwort
4. Bridge-Verarbeitung (Laufzeit)
Abschnitt betitelt „4. Bridge-Verarbeitung (Laufzeit)“Die Brücke empfängt die Nachricht und verarbeitet sie:
Sicherheit: Nur registrierte Dienste und exportierte Methoden sind aufrufbar.
5. Go-Ausführung (Laufzeit)
Abschnitt betitelt „5. Go-Ausführung (Laufzeit)“Die Go-Methode wird ausgeführt:
func (g *GreetService) Greet(name string) string { // This runs in Go return g.prefix + name + "!"}Ausführungskontext:
- Läuft in einer Goroutine (nicht-blockierend)
- Hat Zugriff auf alle Go-Funktionen (Dateisystem, Netzwerk, Datenbanken)
- Kann frei anderen Go-Code aufrufen
- Gibt Ergebnis oder Fehler zurück
6. Antwort (Laufzeit)
Abschnitt betitelt „6. Antwort (Laufzeit)“Das Ergebnis wird an JavaScript zurückgesendet:
// Promise resolves with resultconst greeting = await Greet("World")// greeting = "Hello, World!"Fehlerbehandlung:
func (g *GreetService) Divide(a, b float64) (float64, error) { if b == 0 { return 0, errors.New("division by zero") } return a / b, nil}try { const result = await Divide(10, 0)} catch (error) { console.error("Go error:", error) // "division by zero"}Leistungseigenschaften
Abschnitt betitelt „Leistungseigenschaften“Geschwindigkeit
Abschnitt betitelt „Geschwindigkeit“Typische Aufruf-Overhead: <1ms
Frontend Call → Bridge → Go Execution → Bridge → Frontend Response ↓ ↓ ↓ ↓ ↓ <0.1ms <0.1ms [varies] <0.1ms <0.1msIm Vergleich zu Alternativen:
- HTTP/REST: 5-50ms (Netzwerkstack, Serialisierung)
- IPC: 1-10ms (Prozessgrenzen, Marshalling)
- Wails Bridge: <1ms (im Speicher, direkter Aufruf)
Speicher
Abschnitt betitelt „Speicher“Overhead pro Aufruf: ~1KB (Nachrichtenpuffer)
Zero-Copy-Optimierung: Große Daten (>1MB) verwenden bei Gelegenheit shared Memory.
Nebenläufigkeit
Abschnitt betitelt „Nebenläufigkeit“Aufrufe sind nebenläufig:
- Jeder Aufruf läuft in seiner eigenen Goroutine
- Mehrere Aufrufe können gleichzeitig ausgeführt werden
- Keine Blockierung zwischen Aufrufen
// These run concurrentlyconst [result1, result2, result3] = await Promise.all([ SlowOperation1(), SlowOperation2(), SlowOperation3(),])Typsystem
Abschnitt betitelt „Typsystem“Unterstützte Typen
Abschnitt betitelt „Unterstützte Typen“Primitive
Abschnitt betitelt „Primitive“// Gofunc Example( s string, i int, f float64, b bool,) (string, int, float64, bool) { return s, i, f, b}// TypeScript (auto-generated)function Example( s: string, i: number, f: number, b: boolean,): Promise<[string, number, number, boolean]>Slices und Arrays
Abschnitt betitelt „Slices und Arrays“// Gofunc Sum(numbers []int) int { total := 0 for _, n := range numbers { total += n } return total}// TypeScriptfunction Sum(numbers: number[]): Promise<number>
// Usageconst total = await Sum([1, 2, 3, 4, 5]) // 15// Gofunc GetConfig() map[string]interface{} { return map[string]interface{}{ "theme": "dark", "fontSize": 14, "enabled": true, }}// TypeScriptfunction GetConfig(): Promise<Record<string, any>>
// Usageconst config = await GetConfig()console.log(config.theme) // "dark"Strukturen
Abschnitt betitelt „Strukturen“// Gotype User struct { ID int `json:"id"` Name string `json:"name"` Email string `json:"email"`}
func GetUser(id int) (*User, error) { return &User{ ID: id, Name: "Alice",---
**Fragen zur Brücke?** Fragen Sie im [Discord](https://discord.gg/JDdSxwjhGf) oder überprüfen Sie die [Bindungsbeispiele](https://github.com/wailsapp/wails/tree/master/v3/examples/binding).