Differenze tra Go 1.11 e Go 1.12 e versioni successive

La migrazione al runtime Go 1.12 e versioni successive consente di utilizzare funzionalità del linguaggio aggiornate e di creare app più portabili, con codice idiomatico.

Modifiche al runtime di App Engine Go 1.12 e versioni successive

Se stai prendendo in considerazione una migrazione al runtime Go 1.12 e versioni successive, tieni presente le seguenti differenze tra Go 1.12 e versioni successive e i runtime precedenti nell'ambiente standard di App Engine:

  • Per ridurre lo sforzo e la complessità della migrazione del runtime, l'ambiente standard di App Engine consente di accedere a molti dei servizi e delle API in bundle legacy con runtime Go 1.12 e versioni successive, come Memcache. L'app Go 1.12 o versioni successive può chiamare le API dei servizi in bundle tramite l'SDK App Engine per Go e accedere alla maggior parte delle stesse funzionalità del runtime Go 1.11.

    Hai anche la possibilità di utilizzare prodotti Google Cloud che offrono funzionalità simili a quelle dei servizi in bundle legacy. Questi prodotti Google Cloud forniscono librerie client Cloud per Go idiomatiche. Per i servizi in bundle che non sono disponibili come prodotti separati in Google Cloud, come l'elaborazione di immagini, la ricerca e la messaggistica, puoi utilizzare provider di terze parti o altre soluzioni alternative.

    Per saperne di più sulla migrazione a servizi non in bundle, consulta Migrazione dai servizi in bundle.

  • Il comportamento di alcuni elementi del file di configurazione app.yaml è stato modificato. Per ulteriori informazioni, vedi Modifiche al file app.yaml.

  • Il logging nel runtime Go 1.12 e versioni successive segue lo standard di logging in Cloud Logging. Nel runtime Go 1.12 e versioni successive, i log delle app non sono più raggruppati con i log delle richieste, ma sono separati in record diversi. Per scoprire di più sulla lettura e sulla scrittura dei log nel runtime Go 1.12 e versioni successive, consulta la guida al logging.

Modifiche al file app.yaml

Il comportamento di alcuni elementi del file di configurazione app.yaml è stato modificato:

Elemento Tipo di modifica Descrizione
app_engine_apis Applicabile solo a Go 1.12 e versioni successive Deve essere impostato su true se vuoi accedere ai servizi in bundle legacy per Go 1.12 e versioni successive.
login Supportato se il valore di app_engine_apis è true Se non utilizzi i servizi in bundle legacy per Go 1.12 e versioni successive, utilizza questi metodi alternativi per autenticare gli utenti.
runtime Modificato Modifica l'elemento runtime per specificare Go 1.12 o versioni successive.

Per ulteriori informazioni, consulta il riferimento app.yaml.

Creazione di un pacchetto main

Il servizio deve includere un'istruzione package main in almeno un file di origine. In alternativa, se il servizio utilizza il pacchetto google.golang.org/appengine, includi una chiamata a appengine.Main().

Scrittura di un pacchetto principale

Se il servizio non contiene già un pacchetto main, aggiungi l'istruzione package main e scrivi una funzione main(). Come minimo, la funzione main() deve:

  • Leggi la variabile di ambiente PORT e chiama la funzione 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)
    }

Registrazione dei gestori HTTP

Puoi registrare i tuoi gestori HTTP scegliendo una delle seguenti opzioni:

  • Il metodo preferito consiste nello spostare manualmente tutte le chiamate http.HandleFunc() dai tuoi pacchetti alla funzione main() nel pacchetto main.
  • In alternativa, importa i pacchetti della tua applicazione nel pacchetto main, assicurandoti che ogni funzione init() che contiene chiamate a http.HandleFunc() venga eseguita all'avvio.

    Puoi trovare tutti i pacchetti che utilizzano la chiamata http.HandleFunc() con il seguente script bash e copiare l'output nel blocco import del pacchetto 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
    

Strutturazione dei file

Go richiede che ogni pacchetto abbia una propria directory. Puoi indicare ad App Engine la posizione del pacchetto main utilizzando main: nel file app.yaml del tuo progetto. Ad esempio, se la struttura dei file dell'app ha il seguente aspetto:

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

Il file app.yaml avrebbe:

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

Per ulteriori informazioni sul flag main, consulta il riferimento app.yaml.

Spostamento di file su GOPATH in corso...

Trova il tuo GOPATH utilizzando il seguente comando:

go env GOPATH

Sposta tutti i file e le importazioni pertinenti nel tuo GOPATH. Se utilizzi importazioni relative, come import ./guestbook, aggiornale in modo da utilizzare il percorso completo: import github.com/example/myapp/guestbook.