Perbedaan antara Go 1.11 dan Go 1.12+

Dengan bermigrasi ke runtime Go 1.12+, Anda dapat menggunakan fitur bahasa terbaru dan membangun aplikasi yang lebih portabel dengan kode idiomatis.

Perubahan pada runtime App Engine Go 1.12+

Jika ingin bermigrasi ke runtime Go 1.12+, Anda harus mengetahui perbedaan berikut antara runtime Go 1.12+ dan runtime sebelumnya di lingkungan standar App Engine:

  • Untuk mengurangi upaya dan kompleksitas migrasi runtime, lingkungan standar App Engine memungkinkan Anda mengakses banyak paket layanan dan API versi lama dalam runtime Go 1.12+, seperti Memcache. Aplikasi Go 1.12+ Anda dapat memanggil API paket layanan melalui App Engine SDK for Go, dan mengakses sebagian besar fungsi yang sama seperti pada runtime Go 1.11.

    Anda juga memiliki opsi untuk menggunakan produk Google Cloud yang menawarkan fungsi serupa dengan paket layanan lama. Produk Google Cloud ini menyediakan Library Klien Cloud untuk Go idiomatis. Untuk paket layanan yang tidak tersedia sebagai produk terpisah di Google Cloud, seperti pemrosesan gambar, penelusuran, dan pengiriman pesan, Anda dapat menggunakan penyedia pihak ketiga atau solusi lainnya.

    Untuk mempelajari lebih lanjut cara bermigrasi ke layanan yang tidak dipaketkan, lihat Bermigrasi dari layanan terpaket.

  • Perilaku beberapa elemen dalam file konfigurasi app.yaml telah diubah. Untuk informasi selengkapnya, lihat Perubahan pada file app.yaml.

  • Logging di runtime Go 1.12+ mengikuti standar logging di Cloud Logging. Dalam runtime Go 1.12+, log aplikasi tidak lagi dipaketkan dengan log permintaan, tetapi dipisahkan dalam data yang berbeda. Untuk mempelajari lebih lanjut cara membaca dan menulis log di runtime Go 1.12+, lihat panduan logging.

Perubahan pada file app.yaml

Perilaku beberapa elemen dalam file konfigurasi app.yaml telah diubah:

Elemen Ubah jenis Deskripsi
app_engine_apis Hanya berlaku untuk Go 1.12+ Harus ditetapkan ke true jika Anda ingin mengakses layanan paket lama untuk Go 1.12+.
login Didukung jika app_engine_apis adalah true Jika Anda tidak menggunakan paket layanan lama untuk Go 1.12+, gunakan metode alternatif ini untuk mengautentikasi pengguna.
runtime Modified (Diubah) Ubah elemen runtime untuk menetapkan Go 1.12+.

Untuk informasi selengkapnya, lihat referensi app.yaml.

Membuat paket main

Layanan Anda harus menyertakan pernyataan package main dalam setidaknya satu file sumber. Atau, jika layanan Anda menggunakan paket google.golang.org/appengine, sertakan panggilan ke appengine.Main().

Menulis paket utama

Jika layanan Anda belum berisi paket main, tambahkan pernyataan package main dan tulis fungsi main(). Diminimum ,fungsi main() seharusnya:

  • Baca variabel lingkungan PORT dan panggil fungsi 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)
    }

Mendaftarkan pengendali HTTP Anda

Anda dapat mendaftarkan pengendali HTTP dengan memilih salah satu opsi berikut:

  • Metode yang direkomendasikan adalah memindahkan semua panggilan http.HandleFunc() secara manual dari paket ke fungsi main() dalam paket main.
  • Atau, impor paket aplikasi Anda ke dalam paket main, dengan memastikan setiap fungsi init() yang berisi panggilan ke http.HandleFunc() dijalankan saat memulai.

    Anda dapat menemukan semua paket yang menggunakan panggilan http.HandleFunc() dengan skrip bash berikut, dan menyalin outputnya ke blok import paket main Anda:

    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
    

Membuat struktur file

Go mengharuskan setiap paket memiliki direktorinya sendiri. Anda dapat memberi tahu App Engine lokasi paket main dengan menggunakan main: dalam file app.yaml project Anda. Misalnya, jika struktur file aplikasi Anda terlihat seperti ini:

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

File app.yaml Anda akan memiliki:

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

Untuk mengetahui informasi selengkapnya tentang flag main, lihat referensi app.yaml.

Memindahkan file ke GOPATH Anda

Temukan GOPATH Anda menggunakan perintah berikut:

go env GOPATH

Pindahkan semua file dan impor yang relevan ke GOPATH Anda. Jika menggunakan impor relatif, seperti import ./guestbook, perbarui impor Anda untuk menggunakan jalur lengkap: import github.com/example/myapp/guestbook.