18 · Módulos
Go com extern
Funções Go, dependências de módulos e callbacks pelo Zolo.
Nesta página
Importe go do plugin de mesmo nome. A assinatura usa tipos Zolo; o corpo usa
Go e pode começar com imports nativos. Execute estes exemplos pelo CLI com o
plugin Go instalado.
Chame funções Go tipadas, importe uma função exportada e aguarde uma operação em worker.
// parity-timeout-ms:300000
use plugin go::{go}
extern go fn exact(value: int) -> int {
return value
}
extern go fn upper(value: str) -> str {
import "strings"
return strings.ToUpper(value)
}
extern go async fn later(value: int) -> int {
return value + 1
}
extern go from "./go_fixtures/math.go" use {Add}
print(exact(9007199254740993)) // expected: 9007199254740993
print(upper("hello Go")) // expected: HELLO GO
print(Add(left: 20, right: 22)) // expected: 42
print(await later(41)) // expected: 42
Requer a CLI/host do Zolo — abra no playground ou rode localmente.
int corresponde a int64, float a float64, str a string,
bytes a []byte e arrays a slices. Structs públicas e mapas com chave
string viram records copiados. Conversões de inteiros menores e sem sinal
verificam o intervalo. Métodos com receiver e exports genéricos ou variádicos
precisam de um adaptador concreto de função livre exportada.
O import parte do arquivo Zolo que o declara:
extern go from "./math.go" use {Add}.
Os nomes dos parâmetros exportados permitem chamadas nomeadas, como
Add(left: 20, right: 22).
Módulos
Trave a versão de um módulo uma vez e use seu import nativo em uma função Go.
// Prepare with zolo install or opt into zolo run ... --install=auto.
use plugin go::{go}
extern go deps {
"github.com/google/uuid" = "v1.6.0"
}
extern go fn valid(value: str) -> bool {
import "github.com/google/uuid"
_, err := uuid.Parse(value)
return err == nil
}
print(valid("c9bba9c7-9d7a-4fbb-a2a5-dd344c9be6d1")) // expected: true
Requer a CLI/host do Zolo — abra no playground ou rode localmente.
Em um projeto maior, mova a dependência para o manifesto:
[foreign.go.dependencies]
"github.com/google/uuid" = "v1.6.0"
Execute zolo install main.zolo e depois
zolo run main.zolo --offline --frozen. A resolução registra o grafo transitivo,
hashes dos módulos e um cache privado. A compilação usa esse ambiente fechado com
GOPROXY=off, GOWORK=off, GOTOOLCHAIN=local e seleção de módulos somente
leitura. Uma versão direta exata que a seleção Go tentaria aumentar gera conflito.
Assets nativos de dependências cgo precisam de uma declaração explícita para a
distribuição.
Callbacks, async e distribuição
Um parâmetro fn(int) -> int vira um adaptador func Go válido durante a
invocação. Ele permite voltar ao Zolo e fazer chamadas estrangeiras aninhadas.
Não mantenha o callback emprestado nem o chame de uma goroutine independente.
extern go async fn executa código Go comum em um worker e representa a
conclusão como Future Zolo. Uma goroutine isolada não define essa conclusão.
Cancelar fecha a entrega de callbacks e resultados; não interrompe trabalho nativo
arbitrário. Falhas (T, error) e panics da chamada exportada viram erros Zolo
estruturados. Panics de goroutines independentes e falhas nativas irrecuperáveis
mantêm o comportamento normal do processo.
A preparação precisa de Go, cgo e um compilador C compatível. ZOLO_GO seleciona
Go e CC seleciona o compilador cgo. As consultas nativas do editor usam gopls
via ZOLO_GOPLS. A análise preserva texto não salvo e não carrega a biblioteca
autoral nem executa suas funções init.
Os artefatos mantêm código de máquina, metadados e snapshots do fonte. VM, native e LLVM suportam plugins dinâmicos, embutidos e estáticos sem os fontes, Go, compilador ou cache de módulos na distribuição. Os artefatos pertencem ao OS e arquitetura de compilação. A execução hospedada não está disponível em wasm-aot; a validação atual de runtime cobre Windows x64.
Veja também