Fitur Baru Go 1.27: Generic Methods, encoding/json v2, dan Kriptografi Pasca-Kuantum
Go 1.27 resmi rilis pada 20 Agustus 2026, enam bulan setelah Go 1.26 yang hadir 10 Februari 2026. Rilis ini membawa satu perubahan bahasa yang lama dinanti, backend JSON baru yang lebih ketat, dan mulai mengokohkan kriptografi pasca-kuantum. Hampir semua program tetap terkompilasi tanpa perubahan karena janji kompatibilitas Go 1 tetap dijaga.
Ringkasan:
- Metode kini boleh mendeklarasikan parameter tipe sendiri, seperti fungsi generik biasa.
- encoding/json berjalan di atas v2 dengan default yang lebih ketat.
- Tanda tangan pasca-kuantum ML-DSA tersedia lewat crypto/mldsa dan TLS 1.3.
- Runtime menambahkan profil goroutineleak dan penghematan alokasi kecil.
Metode Generik: Parameter Tipe pada Metode
Sebelum Go 1.27, fungsi generik boleh punya parameter tipe, tetapi metode tidak. Satu-satunya cara adalah menempatkan parameter tipe pada tipe receiver, sehingga semua metode otomatis ikut generik. Mekanisme ini terasa kaku ketika hanya satu metode yang butuh parameter tipe.
Mulai Go 1.27, metode boleh mendeklarasikan parameter tipenya sendiri. Contoh resminya ada di math/rand/v2, yang kini menyediakan metode generik (*Rand).N dengan signature N[Int intType](Int) Int. Sebelumnya paket tersebut hanya punya fungsi generik tingkat atas dengan bentuk N[Int intType](Int) Int.
r := rand.New(rand.NewPCG(1, 2))
n := r.N(100) // metode generik: menerima tipe integer apa pun
fmt.Println(n)Metode generik juga bisa didefinisikan pada tipe sendiri. Praktik ini menempatkan logika generik di namespace tipe yang bersangkutan, bukan menumpuk di tingkat paket.
type ring[T any] struct {
items []T
}
func newRing[T any]() *ring[T] {
return &ring[T]{items: make([]T, 0)}
}
// push generik: parameter tipe dimiliki metode, bukan receiver.
func (r *ring[T]) push(v T) {
r.items = append(r.items, v)
}Satu batasan yang perlu diingat: metode pada interface tetap dilarang memiliki parameter tipe, dan metode generik tidak bisa memenuhi metode interface. Konstruksi interface { M[T any]() } menghasilkan error “interface method must have no type parameters”. Ini keputusan desain agar spesifikasi bahasa tetap sederhana.
Perubahan bahasa lain ikut menyertai:
- Kunci pada struct literal kini boleh berupa berbagai bentuk field selector, bukan cuma nama field tingkat atas.
- Inferensi tipe fungsi digeneralisasi sehingga berlaku di semua konteks saat fungsi generik ditugaskan atau dikonversi ke tipe fungsi yang cocok.
Baru: encoding/json/v2 dan jsontext
Paket encoding/json menjadi salah satu yang paling sering dipakai di ekosistem Go, sehingga perubahan backend-nya patut mendapat perhatian. Go 1.27 menambahkan dua paket baru: encoding/json/v2 untuk pemrosesan semantik, dan encoding/json/jsontext untuk pemrosesan sintaktik tingkat rendah. Paket encoding/json sekarang berjalan di atas implementasi v2, tetapi permukaan API yang sudah ada dibekukan: API v1 tetap tersedia dan tidak ada kewajiban bermigrasi.

Hubungan antar paket terlihat pada diagram di atas. jsontext menyediakan tipe Token dan Value dengan state machine yang menjamin teks JSON valid. Di atasnya, encoding/json/v2 menyediakan fungsi Marshal, Unmarshal, MarshalWrite, MarshalEncode, UnmarshalRead, dan UnmarshalDecode, semuanya menerima argumen variadic Options. Paket pemakai tetap memakai encoding/json biasa tanpa perubahan.
Default yang Lebih Ketat
Perbedaan yang paling terasa adalah default yang lebih ketat di sisi v2. Dua perilaku berikut dianggap bug oleh kebanyakan parser modern, dan v2 memilih menolaknya.
| Perilaku | encoding/json (API v1) | encoding/json/v2 |
|---|---|---|
| UTF-8 tidak valid di dalam string | diterima | ditolak |
| Nama field duplikat dalam objek | diterima, field terakhir menang | ditolak |
| Pemrosesan | Marshal / Unmarshal | plus MarshalWrite / UnmarshalRead / MarshalEncode / UnmarshalDecode |
| Konfigurasi | tag struct | tag struct + variadic Options |
Saya memverifikasi kedua kasus di atas pada Go 1.27.1. Untuk input {"name":"gopher","name":"r2d2"}, json/v2.Unmarshal mengembalikan error duplicate object member name "name", sedangkan v1 menerimanya tanpa keluhan. Hal serupa terjadi pada JSON dengan byte UTF-8 tidak valid: v2 menolak dengan pesan invalid UTF-8, v1 tetap menerimanya.
var out map[string]any
err := jsonv2.Unmarshal([]byte(`{"a":1,"a":2}`), &out)
// err: jsontext: duplicate object member name "a"Bagi tim yang belum siap bermigrasi, paket encoding/json menyediakan berbagai Options untuk meniru perilaku v1. Bila muncul regresi yang tidak bisa diterima, ada tombol darurat: GOEXPERIMENT=nojsonv2 saat build memulihkan implementasi v1. Opsi ini rencananya dihapus pada rilis mendatang.
Soal performa, release notes menyatakan kecepatan marshaling sebanding dengan implementasi lama, dan unmarshaling jauh lebih cepat. Klaim ini berasal dari tim Go dan belum saya konfirmasi dengan benchmark mandiri.
Kriptografi Pasca-Kuantum: crypto/mldsa
Go 1.27 menambahkan paket baru crypto/mldsa yang mengimplementasikan skema tanda tangan pasca-kuantum ML-DSA sesuai FIPS 204. Dukungan tidak berhenti di paket baru: crypto/x509 kini memahami kunci publik dan privat ML-DSA, dan crypto/tls menerima tanda tangan ML-DSA pada TLS 1.3 melalui nilai SignatureScheme baru.
priv, err := mldsa.GenerateKey(mldsa.MLDSA44())
if err != nil {
panic(err)
}
pub := priv.PublicKey()
msg := []byte("pesan rahasia")
sig, err := priv.Sign(nil, msg, crypto.Hash(0))
if err != nil {
panic(err)
}
if err := mldsa.Verify(pub, msg, sig, nil); err != nil {
panic("tanda tangan tidak valid")
}ML-DSA memiliki tiga ranah parameter. Masing-masing menawarkan tingkat keamanan berbeda:
| Parameter set | Kekuatan setara | SignatureScheme TLS 1.3 |
|---|---|---|
| ML-DSA-44 | AES-128 | MLDSA44 |
| ML-DSA-65 | AES-192 | MLDSA65 |
| ML-DSA-87 | AES-256 | MLDSA87 |
Perlu dicatat, konteks pasca-kuantum sebenarnya sudah dimulai lebih awal. Sejak Go 1.26, pertukaran kunci hibrida ML-KEM sudah aktif secara default di TLS. ML-DSA melengkapi sisi tanda tangan sehingga koneksi TLS 1.3 seluruhnya tahan terhadap komputer kuantum dalam satu rilis.
Runtime dan Perkakas
Profil Goroutineleak
Profil goroutineleak, yang dulu eksperimental, kini umum secara penuh. Profil ini melaporkan goroutine yang terkunci pada channel atau mutex dan tidak mungkin pernah terbangun, karena primitive yang ditunggu tidak lagi dijangkau oleh goroutine lain. Aksesnya lewat runtime/pprof atau endpoint /debug/pprof/goroutineleak pada net/http/pprof.
Alokasi Memori Kecil Lebih Cepat
Compiler kini memanggil rutin alokasi yang disesuaikan ukuran untuk alokasi di bawah 80 byte. Menurut release notes, penghematannya sampai 30% per alokasi kecil dan sekitar 1% pada program yang berat alokasi, dengan ongkos ukuran biner bertambah sekitar 60 KB. Ini opt-in terbalik: normalnya aktif, dan bisa dimatikan dengan GOEXPERIMENT=nosizespecializedmalloc.
Perkakas dan Paket Lain
go docmendukungpackage@version, misalnyago doc example.com/[email protected], plus opsi-exuntuk menampilkan contoh kode.go testkini menjalankan pemeriksaanstdversionsecara default untuk menolak simbol yang terlalu baru bagi versi Go padago.mod.compile,link,asm,cgo,cover, danpackmenerima response file@filedengan format kompatibel GCC. Saya memverifikasigo tool compile -o x.o @x.rspbekerja di mesin lokal.go mod tidyuntuk modul bergo 1.27 menggabungkan blokrequireduplikat menjadi dua blok: langsung dan tidak langsung.- Paket baru
uuidmenangani pembuatan dan parsing UUID, dengan komponen acak dari CSPRNG, merujuk RFC 9562. strings.CutLastdanbytes.CutLastmemotong string di sekitar pemisah terakhir, melengkapiCutyang sudah ada.- Dukungan
bzrdihilangkan dari perintahgo, dan Unicode naik dari 15 ke 17.
Apakah Perlu Langsung Upgrade?
Sebagian besar fitur Go 1.27 bekerja di latar belakang tanpa perubahan kode. Migrasi paling masuk akal bila Anda bergantung pada encoding/json yang ketat atau butuh perlindungan pasca-kuantum pada TLS. Bila tetap ingin perilaku lama, Options dan GOEXPERIMENT memberikan jalan keluar sementara. Pastikan versi peralatan pendukung, seperti analisis statis di CI, memahami stdversion dan struktur require yang digabung sebelum menyetel Go 1.27 di go.mod global.
