Go 1.23 membawa fitur yang ditunggu-tunggu: range over function values (iterator pattern resmi), perbaikan timer/ticker, dan perubahan pada package slices & maps. Ini yang perlu kamu tahu.
Go 1.23 resmi dirilis pada Agustus 2026. Versi ini membawa range over function values sebagai fitur bahasa stabil untuk pertama kalinya, perbaikan perilaku time.Timer yang sudah lama ditunggu, dan sejumlah tambahan di standard library.
Apa yang Baru?
Tiga highlight utama Go 1.23:
- Range over functions — iterator pattern resmi menggunakan
iter.Seqdaniter.Seq2 - Timer/Ticker reset yang benar — tidak perlu drain channel lagi setelah
Reset() slicesdanmapsbertambah —Sorted,Collect,AppendSeqdan kawan-kawan
Selain itu, Go 1.23 juga menaikkan requirement minimum ke PHP 8.41 — wait, salah. Go 1.23 menaikkan requirement minimum toolchain ke Go 1.21 untuk upgrade.
Range over Functions
Fitur paling dinantikan: kamu sekarang bisa menulis custom iterator yang bisa di-range:
1// Definisi iterator menggunakan iter.Seq2
2func Backward[E any](s []E) iter.Seq2[int, E] {
3 return func(yield func(int, E) bool) {
4 for i := len(s) - 1; i >= 0; i-- {
5 if !yield(i, s[i]) {
6 return // stop iteration
7 }
8 }
9 }
10}
11
12// Penggunaan — terasa seperti range biasa
13for i, v := range Backward([]string{"a", "b", "c"}) {
14 fmt.Println(i, v)
15}
16// Output:
17// 2 c
18// 1 b
19// 0 aiter sudah ada di standard library sejak Go 1.22 sebagai fitur experimental. Di Go 1.23 statusnya berubah menjadi stable dan siap production.Tiga Signature Iterator
Go mendukung tiga jenis iterator function:
| Signature | Dipakai untuk |
|---|---|
func(yield func() bool) | Iterasi tanpa value |
func(yield func(V) bool) → iter.Seq[V] | Iterasi satu value (seperti range slice) |
func(yield func(K, V) bool) → iter.Seq2[K,V] | Iterasi dua value (seperti range map) |
Perbaikan Timer dan Ticker
Ini perubahan breaking kecil yang memperbaiki ==perilaku tidak intuitif== yang ada sejak Go 1.0:
1// ❌ Sebelum Go 1.23 — harus drain channel sebelum Reset
2timer.Stop()
3select {
4case <-timer.C:
5default:
6}
7timer.Reset(d)
8
9// ✅ Go 1.23 — cukup Reset saja, aman
10timer.Reset(d)GODEBUG=asynctimerchan=0. Periksa panduan migrasi resmi
sebelum upgrade di production — code yang bergantung pada drain manual bisa berperilaku berbeda.Penambahan di Standard Library
package slices
Beberapa fungsi baru yang memanfaatkan iterator:
| Fungsi baru | Kegunaan |
|---|---|
slices.Sorted(seq) | Kumpulkan iterator jadi slice terurut |
slices.SortedFunc(seq, cmp) | Sama, dengan custom comparator |
slices.Collect(seq) | Kumpulkan iter.Seq jadi slice |
slices.AppendSeq(s, seq) | Append semua item dari iterator ke slice |
package maps
1// Iterasi semua entri map sebagai iter.Seq2
2for k, v := range maps.All(m) {
3 fmt.Println(k, v)
4}
5
6// Kumpulkan pasangan key-value dari iterator jadi map
7m := maps.Collect(pairs)Fungsi maps lainnya
maps.Keys(m)— iterator atas semua keymaps.Values(m)— iterator atas semua valuemaps.Insert(m, seq)— insert semua pasangan dari iterator
Cara Upgrade
Upgrade dari Go 1.22 ke 1.23 relatif mulus untuk sebagian besar project:
1# Unduh Go 1.23
2go install golang.org/dl/go1.23@latest
3go1.23 download
4
5# Update go.mod
6go mod tidy
7
8# Jalankan test
9go test ./...GODEBUG yang mempengaruhi perilaku timer.Ringkasan
Go 1.23 bukan rilis besar dari sisi performa, tapi besar dari sisi ergonomis bahasa. Iterator pattern yang sudah lama dirindukan kini resmi dan stabil. Untuk project baru, segera pakai 1.23. Untuk project existing, uji di staging lebih dahulu — terutama jika code kamu bergantung pada perilaku timer lama.
Catatan: ini adalah contoh footnote. Referensi footnote ditulis di akhir artikel dan dirender secara otomatis oleh Hugo. ↩︎