Angka versi Go muncul di banyak tempat sekaligus: keluaran go version, baris go di go.mod, dan judul setiap catatan rilis. Tanpa memahami maknanya, kita sulit memutuskan kapan harus memasang pembaruan, versi minimum apa yang wajar untuk proyek, dan fitur apa yang aman dipakai. Kabar baiknya, skema versi Go termasuk yang paling sederhana di dunia bahasa pemrograman. Pada chapter ini kita akan membaca skema tersebut, memahami kebijakan dukungan resmi, lalu memetakan fitur penting dari rilis-rilis terbaru.
Skema Penomoran Versi #
Versi Go ditulis dengan pola go1.N.x dan terdiri dari tiga bagian. Angka pertama adalah major version yang tidak pernah beranjak dari angka 1 sejak Go 1 dirilis tahun 2012, sebagai wujud janji kompatibilitas Go 1: program yang ditulis untuk Go 1 tetap dapat dikompilasi oleh rilis Go 1 mana pun yang lebih baru. Angka kedua menandakan rilis utama yang baru terbit sekitar enam bulan sekali, biasanya pada bulan Februari dan Agustus. Angka ketiga adalah patch release yang hanya memuat perbaikan galat dan keamanan, tanpa fitur baru.
Mari kita baca keluaran go version dari lingkungan penulisan materi ini dengan pola tersebut:
go versionOutput yang Dihasilkan:
go version go1.27.2 linux/amd64Teks go1.27.2 berarti toolchain tersebut adalah rilis utama ke-27 dengan patch kedua. Karena rilis utama terbit tiap enam bulan, angka kedua juga menjadi petunjuk usia: semakin dekat angka tersebut dengan rilis terbaru, semakin panjang masa dukungan yang tersisa.
Kebijakan Dukungan Dua Rilis Terakhir #
Tim Go mendukung setiap rilis utama hingga tersedia dua rilis utama yang lebih baru. Artinya, pada saat materi ini ditulis dengan Go 1.27 sebagai rilis terbaru, dua versi yang didukung penuh adalah Go 1.27 dan Go 1.26; Go 1.25 dan yang lebih lama sudah tidak menerima perbaikan keamanan lagi. Tabel berikut merangkum keadaannya:
| Rilis | Status dukungan | Tindakan yang disarankan |
|---|---|---|
| Go 1.27 | didukung penuh | dipakai untuk belajar dan proyek baru |
| Go 1.26 | didukung penuh | aman untuk sistem produksi yang belum migrasi |
| Go 1.25 dan lebih lama | tidak didukung | pasang rilis terbaru demi perbaikan keamanan |
Toolchain Otomatis di go.mod #
Sejak Go 1.21, berkas go.mod memiliki dua baris yang mengatur versi: directive go menyatakan versi minimum bahasa yang dibutuhkan proyek, sedangkan directive toolchain opsional menyatakan toolchain yang disarankan. Perintah go modern dilengkapi mekanisme pengunduhan toolchain otomatis yang diatur variabel GOTOOLCHAIN:
go env GOTOOLCHAINOutput yang Dihasilkan:
autoNilai bawaan auto membuat perintah go mengunduh dan memakai toolchain yang lebih baru secara otomatis ketika sebuah proyek mensyaratkan versi di atas toolchain yang terpasang. Dengan mekanisme ini, satu komputer cukup memasang satu Go, sementara tiap proyek tetap dikompilasi dengan versi yang dicantumkan di go.mod masing-masing.
Fitur Penting Tiap Rilis #
Tabel berikut merangkum fitur yang paling sering dipakai sehari-hari dari rilis-rilis modern. Baris 1.20 sampai 1.22 akan kita uji langsung dengan sebuah program setelah tabel ini:
| Rilis | Fitur penting |
|---|---|
| Go 1.20 | errors.Join menggabungkan beberapa error menjadi satu |
| Go 1.21 | builtin min, max, clear; package slices, maps, dan log/slog; mekanisme GOTOOLCHAIN |
| Go 1.22 | variabel loop baru tiap iterasi; range over int; pola method pada http.ServeMux; math/rand/v2 |
| Go 1.23 | package iter dengan tipe Seq sebagai dasar range over function |
| Go 1.24 | generic type aliases; directive tool pada go.mod |
| Go 1.25 | package testing/synctest untuk pengujian kode konkuren (sebelumnya eksperimen GOEXPERIMENT) |
| Go 1.26, 1.27 | rujuk catatan rilis resmi di go.dev/doc/go1.26 dan go.dev/doc/go1.27 |
Berkas fitur-versi.go pada bagian bawah halaman menguji empat fitur dari tabel di atas dalam satu program yang hanya memakai standard library:
package main
import (
"errors"
"fmt"
"slices"
)
func main() {
// Go 1.20: errors.Join menggabungkan beberapa error menjadi satu
salahKuota := errors.New("kuota melebihi batas")
salahHarga := errors.New("harga tidak valid")
fmt.Println(errors.Join(salahKuota, salahHarga))
// Go 1.21: min dan max menjadi builtin
fmt.Println(min(3, 7, 5))
fmt.Println(max(3, 7, 5))
// Go 1.21: package slices menyediakan utilitas slice siap pakai
harga := []int{9, 3, 7, 1}
slices.Sort(harga)
fmt.Println(harga)
// Go 1.22: range over int, menghitung 0+1+2+3+4
total := 0
for i := range 5 {
total += i
}
fmt.Println(total)
}Output yang Dihasilkan:
kuota melebihi batas
harga tidak valid
3
7
[1 3 7 9]
10Mari kita telaah bagian-bagian kuncinya:
- Baris
errors.Join(salahKuota, salahHarga): menggabungkan dua error menjadi satu; pencetakan hasil penggabungan menampilkan kedua pesan pada baris yang berurutan. - Baris
min(3, 7, 5)danmax(3, 7, 5): memanggil builtin yang baru tersedia sejak Go 1.21 tanpa perlu import apa pun. - Baris
slices.Sort(harga): mengurutkan slice di tempat dengan utilitas dari packageslices, juga hadir sejak Go 1.21. - Baris
for i := range 5: mengulang nilaiidari 0 hingga 4 — bentuk range over int yang diperkenalkan Go 1.22 — sehinggatotalbernilai10.
Skema versi yang kini jelas, ditambah kebijakan dukungan dua rilis terakhir dan toolchain otomatis, melengkapi peta teknis lingkungan kerja kita. Satu hal terakhir yang perlu dikuasai sebelum masuk ke materi bahasa: mengatasi masalah instalasi yang kerap muncul di lapangan.
Referensi #
- Release History — riwayat seluruh rilis dan kebijakan dukungan resmi.
- Go 1 compatibility promise — janji kompatibilitas mayor versi 1.
- Go toolchains
— cara kerja directive
go,toolchain, danGOTOOLCHAIN. - Go 1.27 Release Notes — catatan rilis versi terbaru yang dipakai materi ini.
Berkas Sumber
Berkas pendukung halaman ini dapat diunduh dan dijalankan langsung sesuai penjelasan di atas.
fitur-versi.go
Unduh berkaspackage main
import (
"errors"
"fmt"
"slices"
)
func main() {
// Go 1.20: errors.Join menggabungkan beberapa error menjadi satu
salahKuota := errors.New("kuota melebihi batas")
salahHarga := errors.New("harga tidak valid")
fmt.Println(errors.Join(salahKuota, salahHarga))
// Go 1.21: min dan max menjadi builtin
fmt.Println(min(3, 7, 5))
fmt.Println(max(3, 7, 5))
// Go 1.21: package slices menyediakan utilitas slice siap pakai
harga := []int{9, 3, 7, 1}
slices.Sort(harga)
fmt.Println(harga)
// Go 1.22: range over int, menghitung 0+1+2+3+4
total := 0
for i := range 5 {
total += i
}
fmt.Println(total)
}