Мост Go-Frontend
Прямая коммуникация Go-JavaScript
Заголовок раздела «Прямая коммуникация Go-JavaScript»Wails предоставляет прямой мост в памяти между Go и JavaScript, обеспечивая бесшовную коммуникацию без накладных расходов HTTP, границ процессов или узких мест сериализации.
Общая картина
Заголовок раздела «Общая картина»Ключевой момент: Никакого HTTP, никакого IPC, никаких границ процессов. Только прямые вызовы функций с проверкой типов.
Как это работает: пошагово
Заголовок раздела «Как это работает: пошагово»1. Регистрация сервисов (запуск)
Заголовок раздела «1. Регистрация сервисов (запуск)»При запуске вашего приложения Wails сканирует ваши сервисы:
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, "}), },})Что делает Wails:
- Сканирует структуру на наличие экспортируемых методов
- Извлекает информацию о типах (параметры, возвращаемые типы)
- Создает реестр, сопоставляющий имена методов функциям
- Генерирует привязки TypeScript с полными определениями типов
2. Генерация привязок (время сборки)
Заголовок раздела «2. Генерация привязок (время сборки)»Wails автоматически генерирует привязки TypeScript:
export function Greet(name: string): Promise<string>export function Add(a: number, b: number): Promise<number>Сопоставление типов:
| Тип Go | Тип TypeScript |
|---|---|
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 | Исключение (выбрасывается) |
3. Вызов из Frontend (время выполнения)
Заголовок раздела «3. Вызов из Frontend (время выполнения)»Разработчик вызывает метод Go из JavaScript:
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) // 8Что происходит:
- Вызов функции привязки -
Greet("World") - Создание сообщения -
{ service: "GreetService", method: "Greet", args: ["World"] } - Отправка в мост - Через JavaScript-мост WebView
- Возврат Promise - Ожидание ответа
4. Обработка моста (время выполнения)
Заголовок раздела «4. Обработка моста (время выполнения)»Мост получает сообщение и обрабатывает его:
Безопасность: Вызываемы только зарегистрированные сервисы и экспортируемые методы.
5. Выполнение Go (время выполнения)
Заголовок раздела «5. Выполнение Go (время выполнения)»Метод Go выполняется:
func (g *GreetService) Greet(name string) string { // This runs in Go return g.prefix + name + "!"}Контекст выполнения:
- Выполняется в горутине (неблокирующий)
- Имеет доступ ко всем возможностям Go (файловая система, сеть, базы данных)
- Может свободно вызывать другой код Go
- Возвращает результат или ошибку
6. Ответ (время выполнения)
Заголовок раздела «6. Ответ (время выполнения)»Результат отправляется обратно в JavaScript:
// Promise resolves with resultconst greeting = await Greet("World")// greeting = "Hello, World!"Обработка ошибок:
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"}Характеристики производительности
Заголовок раздела «Характеристики производительности»Скорость
Заголовок раздела «Скорость»Типичные накладные расходы на вызов: <1мс
Frontend Call → Bridge → Go Execution → Bridge → Frontend Response ↓ ↓ ↓ ↓ ↓ <0.1ms <0.1ms [varies] <0.1ms <0.1msПо сравнению с альтернативами:
- HTTP/REST: 5-50мс (сетевой стек, сериализация)
- IPC: 1-10мс (границы процессов, маршалинг)
- Wails Bridge: <1мс (в памяти, прямой вызов)
Накладные расходы на вызов: ~1КБ (буфер сообщения)
Оптимизация без копирования: Большие данные (>1МБ) используют разделяемую память, где это возможно.
Параллелизм
Заголовок раздела «Параллелизм»Вызовы выполняются параллельно:
- Каждый вызов выполняется в своей собственной горутине
- Несколько вызовов могут выполняться одновременно
- Нет блокировок между вызовами
// These run concurrentlyconst [result1, result2, result3] = await Promise.all([ SlowOperation1(), SlowOperation2(), SlowOperation3(),])Система типов
Заголовок раздела «Система типов»Поддерживаемые типы
Заголовок раздела «Поддерживаемые типы»Примитивы
Заголовок раздела «Примитивы»// 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]>Слайсы и массивы
Заголовок раздела «Слайсы и массивы»// 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Карты (Maps)
Заголовок раздела «Карты (Maps)»// 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"Структуры
Заголовок раздела «Структуры»// 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",---
**Вопросы о мосте?** Задавайте их в [Discord](https://discord.gg/JDdSxwjhGf) или проверяйте [примеры привязок](https://github.com/wailsapp/wails/tree/master/v3/examples/binding).