Unterschiede zwischen Go 1.11 und Go 1.12+

Die Migration zur Go 1.12+-Laufzeit bietet Ihnen die Möglichkeit, aktuelle Sprachfunktionen zu verwenden und mit idiomatischem Code portablere Anwendungen zu erstellen.

Änderungen in der App Engine Go 1.12+-Laufzeit

Wenn Sie eine Migration zur Go 1.12+-Laufzeit planen, müssen Sie die folgenden Unterschiede zwischen den Laufzeiten von Go 1.12+ und früheren Versionen in der App Engine-Standardumgebung beachten:

  • Zur Reduzierung des Aufwands und der Komplexität der Laufzeitmigration können Sie mit der App Engine-Standardumgebung auf viele der gebündelte Legacy-Dienste und -APIs in der Go 1.12+-Laufzeit zugreifen wie z. B. Memcache. Mit Ihrer Go 1.12+-Anwendung können die gebündelten Dienst-APIs über das App Engine SDK für Go aufgerufen und es kann auf die meisten Funktionen der Go 1.11-Laufzeit zugegriffen werden.

    Sie haben auch die Möglichkeit, Google Cloud-Produkte zu verwenden, die vergleichbare Funktionen wie die gebündelten Legacy-Dienste bereitstellen. Diese Google Cloud-Produkte bieten idiomatische Cloud-Clientbibliotheken für Go. Für die gebündelten Dienste, die in Google Cloud nicht als eigenständige Produkte verfügbar sind, wie Bildverarbeitung, Suche oder Messaging, können Sie Drittanbieter oder andere Behelfslösungen verwenden.

    Weitere Informationen zur Migration zu nicht gebündelten Diensten finden Sie unter Von gebündelten Diensten migrieren.

  • Das Verhalten einiger Elemente in der Konfigurationsdatei app.yaml wurde geändert: Weitere Informationen finden Sie unter Änderungen an der Datei app.yaml.

  • Das Logging in der Go 1.12+-Laufzeit folgt dem Logging-Standard von Cloud Logging. In der Laufzeit von Go 1.12+ werden Anwendungslogs nicht mehr mit den Anfragelogs gebündelt, sondern in verschiedenen Datensätzen getrennt. Weitere Informationen zum Lesen und Schreiben von Logs in der Go 1.12+-Laufzeit finden Sie in der Logging-Anleitung.

Änderungen an der Datei app.yaml

Das Verhalten einiger Elemente in der Konfigurationsdatei app.yaml wurde geändert:

Element Änderungstyp Beschreibung
app_engine_apis Gilt nur für Go 1.12+ Muss auf true gesetzt werden, wenn Sie auf die gebündelten Legacy-Dienste für Go 1.12 oder höher zugreifen möchten.
login Unterstützt, wenn für app_engine_apis der Wert true gilt. Wenn Sie keine gebündelten Legacy-Dienste für Go 1.12+ nutzen, können Sie diese alternativen Methoden zur Authentifizierung von Nutzern verwenden.
runtime Geändert Ändern Sie das Element runtime so, dass Go 1.12+ angegeben wird.

Weitere Informationen finden Sie in der Referenz zu app.yaml.

main-Paket erstellen

Ihr Dienst muss in mindestens einer Quelldatei eine package main-Anweisung enthalten. Alternativ können Sie einen Aufruf von appengine.Main() hinzufügen, wenn Ihr Dienst das Paket google.golang.org/appengine verwendet.

main-Paket schreiben

Wenn Ihr Dienst noch kein main-Paket enthält, fügen Sie die Anweisung package main hinzu und schreiben Sie eine main()-Funktion. Die Funktion main() muss mindestens:

  • Die Umgebungsvariable PORT lesen und die Funktion http.ListenAndServe() aufrufen:

    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)
    }

HTTP-Handler registrieren

Wählen Sie eine der folgenden Optionen, mit denen sich HTTP-Handler registrieren lassen:

  • Die bevorzugte Methode besteht darin, alle http.HandleFunc()-Aufrufe von Ihren Paketen manuell in die main()-Funktion in Ihrem main-Paket zu verschieben.
  • Alternativ können Sie die Pakete Ihrer Anwendung in das main-Paket importieren. Bei dieser Vorgehensweise müssen Sie gewährleisten, dass jede init()-Funktion, die Aufrufe von http.HandleFunc() enthält, beim Start ausgeführt wird.

    Sie können alle Pakete, die den http.HandleFunc()-Aufruf verwenden, mit dem folgenden Bash-Skript finden und die Ausgabe in den import-Block Ihres main-Pakets kopieren:

    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
    

Dateien strukturieren

Go erfordert, dass jedes Paket über ein eigenes Verzeichnis verfügt. Sie können App Engine mitteilen, wo sich Ihr main-Paket befindet, indem Sie main: in der app.yaml-Datei Ihres Projekts verwenden. Beispiel: Wenn die Dateistruktur Ihrer Anwendung so aussieht:

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

Hätte Ihre app.yaml-Datei Folgendes:

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

Weitere Informationen zum Flag main finden Sie in der app.yaml-Referenz.

Dateien in GOPATH verschieben

Ihren GOPATH finden Sie mit dem folgenden Befehl:

go env GOPATH

Verschieben Sie alle relevanten Dateien und Importe in GOPATH. Wenn Sie relative Importe wie import ./guestbook verwenden, aktualisieren Sie Ihre Importe, um den vollständigen Pfad zu verwenden: import github.com/example/myapp/guestbook.