Diferenças entre o Go 1.11 e o Go 1.12+

A migração para o ambiente de execução do Go 1.12+ permite usar recursos de linguagem atualizados e criar aplicativos mais portáteis, com código idiomático.

Alterações no ambiente de execução do Go 1.12+ do App Engine

Se você estiver pensando em migrar para o ambiente de execução do Go 1.12+, esteja ciente das seguintes diferenças entre os ambientes de execução do Go 1.12+ e ambientes anteriores no ambiente padrão do App Engine:

  • Para reduzir o esforço e a complexidade da migração no ambiente de execução, o ambiente padrão do App Engine permite acessar vários serviços e APIs em pacote legados no ambiente de execução do Go 1.12+, como o Memcache. O aplicativo Go 1.12+ pode chamar as APIs de serviços incluídos pelo SDK do App Engine para Go e acessar a maioria das mesmas funcionalidades que o ambiente de execução do Go 1.11.

    Você também tem a opção de usar produtos do Google Cloud que oferecem funcionalidades semelhantes aos serviços incluídos legados. Esses produtos do Google Cloud oferecem bibliotecas de cliente idiomáticas do Cloud para Go. Para os serviços incluídos que não estão disponíveis como produtos separados no Google Cloud, como processamento de imagens, pesquisa e mensagens, use provedores de terceiros ou outras soluções alternativas.

    Para saber mais sobre como migrar para serviços desagrupados, consulte Como migrar de serviços incluídos.

  • O comportamento de alguns elementos no arquivo de configuração app.yaml foi modificado. Para obter mais informações, consulte Alterações no arquivo app.yaml.

  • A geração de registros no ambiente de execução do Go 1.12+ segue o padrão de geração de registros no Cloud Logging. No ambiente de execução do Go 1.12+, os registros de aplicativos não são mais incluídos com os registros de solicitação, mas são separados em registros diferentes. Para saber mais sobre como ler e gravar registros no ambiente de execução do Go 1.12+, consulte o guia de geração de registros.

Alterações no arquivo app.yaml

O comportamento de alguns elementos no arquivo de configuração app.yaml foi modificado:

Elemento Tipo de alteração Descrição
app_engine_apis Aplicável somente para o Go 1.12+ Defina como true se você quiser acessar os serviços agrupados legados para o Go 1.12+.
login Compatível se app_engine_apis for true Se você não estiver usando os serviços incluídos legados para Go 1.12+, use estes métodos alternativos para autenticar usuários.
runtime Modificado Altere o elemento runtime para especificar o Go 1.12+.

Para obter mais informações, consulte a referência app.yaml.

Como criar um pacote main

O serviço precisa incluir uma instrução package main em pelo menos um arquivo de origem. Como alternativa, se o serviço estiver usando o pacote google.golang.org/appengine, inclua uma chamada para appengine.Main().

Como gravar um pacote principal

Se o serviço ainda não tiver um pacote main, adicione a instrução package main e grave uma função main(). No mínimo, a função main() precisa:

  • Ler a variável de ambiente PORT e chamar a função http.ListenAndServe():

    port := os.Getenv("PORT")
    if port == "" {
    	port = "8080"
    	log.Printf("Defaulting to port %s", port)
    }
    
    log.Printf("Listening on port %s", port)
    if err := http.ListenAndServe(":"+port, nil); err != nil {
    	log.Fatal(err)
    }

Como registrar os gerenciadores HTTP

É possível registrar seus gerenciadores HTTP escolhendo uma das seguintes opções:

  • O método preferido é mover manualmente todas as chamadas http.HandleFunc() dos seus pacotes para a função main() no pacote main.
  • Como alternativa, importe os pacotes do aplicativo para o pacote main, garantindo que cada função init() que contém chamadas para http.HandleFunc() seja executada na inicialização.

    É possível todos os pacotes que usam a chamada http.HandleFunc() com o script bash a seguir e copiar a saída para o bloco import do pacote main:

    gp=$(go env GOPATH) && p=$(pwd) && pkg=${p#"$gp/src/"} && find . -name "*.go" | xargs grep "http.HandleFunc" --files-with-matches | grep -v vendor/ | grep -v '/main.go' | sed "s#\./\(.*\)/[^/]\+\.go#\t_ \"$pkg/\1\"#" | sort | uniq
    

Como estruturar seus arquivos

O Go requer que cada pacote tenha o próprio diretório. É possível informar ao App Engine onde está seu pacote main usando main: no arquivo app.yaml do projeto. Por exemplo, se a estrutura de arquivos do aplicativo tiver esta aparência:

myapp/
├── app.yaml
├── foo.go
├── bar.go
└── web/
    └── main.go

O arquivo app.yaml teria:

main: ./web # Relative filepath to the directory containing your main package.

Para obter mais informações sobre a sinalização main, consulte a referência de app.yaml.

Como mover arquivos para o GOPATH

Encontre o GOPATH usando o seguinte comando:

go env GOPATH

Mova todos os arquivos relevantes e importa para GOPATH. Se estiver usando importações relativas, como import ./guestbook, atualize as importações para usar o caminho completo: import github.com/example/myapp/guestbook.