Home / Programming Languages, Databases, and Software Development / Fitur Baru Go 1.27: …

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.

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

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

Lapis paket JSON Go 1.27: encoding/json memakai implementasi v2, dan v2 memakai jsontext sebagai Encoder dan Decoder
encoding/json berjalan di atas v2, yang dibangun di atas jsontext.

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.

Perilakuencoding/json (API v1)encoding/json/v2
UTF-8 tidak valid di dalam stringditerimaditolak
Nama field duplikat dalam objekditerima, field terakhir menangditolak
PemrosesanMarshal / Unmarshalplus MarshalWrite / UnmarshalRead / MarshalEncode / UnmarshalDecode
Konfigurasitag structtag 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.

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

go
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 setKekuatan setaraSignatureScheme TLS 1.3
ML-DSA-44AES-128MLDSA44
ML-DSA-65AES-192MLDSA65
ML-DSA-87AES-256MLDSA87

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 doc mendukung package@version, misalnya go doc example.com/pkg@v1.2.3, plus opsi -ex untuk menampilkan contoh kode.
  • go test kini menjalankan pemeriksaan stdversion secara default untuk menolak simbol yang terlalu baru bagi versi Go pada go.mod.
  • compile, link, asm, cgo, cover, dan pack menerima response file @file dengan format kompatibel GCC. Saya memverifikasi go tool compile -o x.o @x.rsp bekerja di mesin lokal.
  • go mod tidy untuk modul bergo 1.27 menggabungkan blok require duplikat menjadi dua blok: langsung dan tidak langsung.
  • Paket baru uuid menangani pembuatan dan parsing UUID, dengan komponen acak dari CSPRNG, merujuk RFC 9562.
  • strings.CutLast dan bytes.CutLast memotong string di sekitar pemisah terakhir, melengkapi Cut yang sudah ada.
  • Dukungan bzr dihilangkan dari perintah go, 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.