Gopherjs compila o código Go (go.dev) para o código JavaScript puro. Seu principal objetivo é dar a você a oportunidade de escrever código de front-end em Go, que ainda será executado em todos os navegadores.
syscall/js compatível com o Upstream Go 1.16.Experimente o Gopherjs no playground do Gopherjs.
Quase tudo, incluindo goroutines (documentação de compatibilidade). O desempenho é muito bom na maioria dos casos, consulte a referência do motor do jogo HTML5. O CGO não é suportado.
Gopherjs requer ir 1,19 ou mais recente. Se você precisar de uma versão GO mais antiga, poderá usar uma versão mais antiga do Gopherjs.
Instale os Gopherjs com go install :
go install github.com/gopherjs/[email protected] # Or replace 'v1.19.0-beta1' with another version.
Se a sua distribuição GO local, conforme relatado pela go version for mais recente que o Go 1.19, você precisará definir a variável de ambiente GOPHERJS_GOROOT para um diretório que contém uma distribuição GO 1.19. Por exemplo:
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.
Agora você pode usar gopherjs build [package] , gopherjs build [files] ou gopherjs install [package] que se comportam semelhante à ferramenta go . Para pacotes main , esses comandos criam um arquivo .js e mapa de origem .js.map no diretório atual ou em $GOPATH/bin . O arquivo JavaScript gerado pode ser usado como de costume em um site. Use gopherjs help [command] para obter uma lista de sinalizadores de linha de comando possíveis, por exemplo, para minificação e buscar automaticamente as alterações.
gopherjs usa o valor GOOS padrão da sua plataforma ao gerar código. GOOS valores suportados são: linux , darwin . Se você estiver em uma plataforma diferente (por exemplo, Windows ou FreeBSD), precisará definir a variável de ambiente GOOS como um valor suportado. Por exemplo, GOOS=linux gopherjs build [package] .
Nota: Os Gopherjs tentarão escrever arquivos de objeto compilados dos pacotes principais no seu diretório $ goroot/pkg. Se isso falhar, ele voltará para $ gopath/pkg.
Se você deseja usar o teste gopherjs run ou gopherjs test para executar o código gerado localmente, instale o Node.js 18 (ou mais recente).
Nas plataformas GOOS suportadas, é possível disponibilizar chamadas do sistema (acesso ao sistema de arquivos etc.). Consulte Doc/syscalls.md para obter instruções sobre como fazê -lo.
gopherjs serve é um comando útil que você pode usar durante o desenvolvimento. Ele iniciará um servidor HTTP servir em ": 8080" por padrão e depois compilará seus pacotes Go com Gopherjs e os servirá.
Por exemplo, navegando para http://localhost:8080/example.com/user/project/ deve compilar e executar o pacote go example.com/user/project . A saída JavaScript gerada será servida em http://localhost:8080/example.com/user/project/project.js (o nome do arquivo .js será igual ao nome do diretório base). Se o diretório contiver index.html , ele será servido, caso contrário, um index.html mínimo.html que inclua <script src="project.js"></script> será fornecido, fazendo com que o javascript seja executado. Todos os outros arquivos estáticos também serão servidos.
Refrescante no navegador reconstruirá os arquivos servidos, se necessário. Os erros de compilação serão exibidos no terminal e no console do navegador. Além disso, servirá a $ goroot e $ gopath para os fontes de origem.
Se você incluir um argumento, será a raiz da qual tudo será servido. Por exemplo, se você executar gopherjs serve github.com/user/project , o javascript gerado para o pacote github.com/user/project/mypkg será servido em http: // localhost: 8080/mypkg/mypkg.js.
Existem algumas variáveis ambientais específicas de Gopherjs:
GOPHERJS_GOROOT - Se definido, o gopherjs usa esse valor como o valor do goroot padrão, em vez de usar o sistema goroot como o valor padrão do gorootGOPHERJS_SKIP_VERSION_CHECK - Se definido como true, o Gopherjs não verificará a versão Go no GOROOT para compatibilidade com a versão do Gopherjs. Isso é principalmente útil para testar os Gopherjs contra versões não lançadas do GO.-m para gerar código minificado.int em vez de (u)int8/16/32/64 .float64 em vez de float32 . O pacote github.com/gopherjs/gopherjs/js (consulte a documentação) fornece funções para interagir com as APIs nativas de JavaScript. Por exemplo a linha
document . write ( "Hello world!" ) ;ficaria assim em Go:
js . Global . Get ( "document" ). Call ( "write" , "Hello world!" )Você também pode querer usar as ligações DOM, as ligações jQuery (veja o exemplo de ToDomvc) ou as ligações do AngularJS. Essas são algumas das ligações às APIs e bibliotecas de JavaScript por membros da comunidade.
Defina uma variável global como um mapa que contém as funções:
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
}Para mais detalhes, consulte o post do blog de Jason Stone sobre Gopherjs.
Gopherjs emula um ambiente de 32 bits. Isso significa que int , uint e uintptr têm uma precisão de 32 bits. No entanto, os tipos inteiros explícitos de 64 bits int64 e uint64 são suportados.
O valor de GOOS desse ambiente é js , e o valor GOARCH é ecmascript . Você pode usar esses valores nas restrições de construção ao escrever um código específico da plataforma. (Gopherjs 1.17 e mais antigo usou js como valor GOARCH .)
A função main é executada como de costume, depois que todas as funções init foram executadas. Os retornos de chamada do JavaScript também podem invocar funções Go, mesmo depois que a função main saia. Portanto, o final da função main não deve ser considerado como o fim da aplicação e não encerra a execução de outras goroutinas.
No navegador, chamando os.Exit (por exemplo, indiretamente pelo log.Fatal ) também não encerra a execução do programa. Por conveniência, ele chama runtime.Goexit para encerrar imediatamente a goroutina de chamada.
Os goroutines são totalmente suportados por Gopherjs. A única restrição é que você precisa iniciar uma nova goroutina se quiser usar o código de bloqueio chamado do JavaScript externo:
js . Global . Get ( "myButton" ). Call ( "addEventListener" , "click" , func () {
go func () {
[ ... ]
someBlockingFunction ()
[ ... ]
}()
})Como funciona:
O JavaScript não tem conceito de simultaneidade (exceto os trabalhadores da web, mas esses são estritamente separados para serem usados para goroutines). Por causa disso, as instruções em JavaScript nunca estão bloqueando. Uma chamada de bloqueio congelaria efetivamente a capacidade de resposta da sua página da web; portanto, as chamadas com argumentos de retorno de chamada são usadas.
O Gopherjs faz um levantamento pesado para contornar essa restrição: sempre que uma instrução estiver bloqueando (por exemplo, comunicando -se com um canal que não está pronto), toda a pilha será relaxada (= todas as funções retornam) e a goroutina será colocada para dormir. Em seguida, outra goroutina pronta para retomar é escolhida e sua pilha com todas as variáveis locais será restaurada.
Se você deseja fazer alterações no compilador do Gopherjs, consulte as diretrizes do desenvolvedor para obter informações adicionais para o desenvolvedor.