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:

bash
go version

Output yang Dihasilkan:

text
go version go1.27.2 linux/amd64

Teks 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:

RilisStatus dukunganTindakan yang disarankan
Go 1.27didukung penuhdipakai untuk belajar dan proyek baru
Go 1.26didukung penuhaman untuk sistem produksi yang belum migrasi
Go 1.25 dan lebih lamatidak didukungpasang 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:

bash
go env GOTOOLCHAIN

Output yang Dihasilkan:

text
auto

Nilai 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:

RilisFitur penting
Go 1.20errors.Join menggabungkan beberapa error menjadi satu
Go 1.21builtin min, max, clear; package slices, maps, dan log/slog; mekanisme GOTOOLCHAIN
Go 1.22variabel loop baru tiap iterasi; range over int; pola method pada http.ServeMux; math/rand/v2
Go 1.23package iter dengan tipe Seq sebagai dasar range over function
Go 1.24generic type aliases; directive tool pada go.mod
Go 1.25package testing/synctest untuk pengujian kode konkuren (sebelumnya eksperimen GOEXPERIMENT)
Go 1.26, 1.27rujuk 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:

go
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:

text
kuota melebihi batas
harga tidak valid
3
7
[1 3 7 9]
10

Mari kita telaah bagian-bagian kuncinya:

  1. Baris errors.Join(salahKuota, salahHarga): menggabungkan dua error menjadi satu; pencetakan hasil penggabungan menampilkan kedua pesan pada baris yang berurutan.
  2. Baris min(3, 7, 5) dan max(3, 7, 5): memanggil builtin yang baru tersedia sejak Go 1.21 tanpa perlu import apa pun.
  3. Baris slices.Sort(harga): mengurutkan slice di tempat dengan utilitas dari package slices, juga hadir sejak Go 1.21.
  4. Baris for i := range 5: mengulang nilai i dari 0 hingga 4 — bentuk range over int yang diperkenalkan Go 1.22 — sehingga total bernilai 10.

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 #

Berkas Sumber

Berkas pendukung halaman ini dapat diunduh dan dijalankan langsung sesuai penjelasan di atas.

fitur-versi.go

Unduh berkas
go
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)
}