Petunjuk dan konteks
Sebuah tim Go memelihara beberapa modul. Library publiknya harus tetap dapat di-build dengan Go 1.26, sementara modul eksperimental ingin mengevaluasi generic methods yang dijelaskan dalam catatan rilis Go 1.27. Tim berharap dapat menempatkan operasi generik terkait tipe dalam namespace method tanpa mengubah kompatibilitas interface, persyaratan toolchain, atau pipeline rilis. Jelaskan batasan bahasa, desain eksperimen, matriks build, dan kondisi keluar (exit conditions).
Halaman Go secara eksplisit melabeli catatan 1.27 sebagai draft, menyatakan bahwa rilis tersebut belum tersedia, dan memperkirakan rilis pada Agustus 2026. Halaman tersebut menjelaskan method yang mendeklarasikan type parameter-nya sendiri, sembari menyatakan bahwa interface method tidak dapat mendeklarasikan type parameter dan tidak dapat diimplementasikan oleh generic method. Perlakukan hal ini sebagai batasan pra-rilis, bukan kepastian bahasa yang stabil.
Apa yang dinilai oleh pewawancara
Pewawancara sedang menguji apakah Anda dapat membedakan type parameter pada suatu tipe, fungsi, dan method, serta apakah Anda memahami bahwa method yang tampaknya lebih generik tidak secara otomatis memenuhi suatu interface. Jawaban yang kuat mengusulkan eksperimen minimal, matriks kompilator dan go.mod, isolasi API publik, rollback, serta catatan perubahan draft.
Pertanyaan klarifikasi yang perlu diajukan
- Apakah tujuannya adalah ekspresi pemanggil (caller expressiveness), inferensi tipe, atau penggunaan kembali implementasi internal?
- Bisakah kode eksperimental diimpor oleh modul stabil, generator, plugin, atau konsumen eksternal?
- Berapa versi Go minimum, cakupan interface, dan ritme rilis untuk API publik?
- Kompilator, penganalisis, IDE, dan platform CI mana yang harus diverifikasi?
- Jika draft tersebut diganti namanya, ditarik, atau diubah secara semantik, bisakah eksperimen dihapus tanpa mengubah modul yang stabil?
Jawaban 30 detik
“Saya akan melabeli Go 1.27 sebagai draft dan menempatkan eksperimen tersebut dalam modul dan CI job yang terisolasi tanpa mengubah API publik Go 1.26. Sebuah generic method dapat mendeklarasikan type parameter-nya sendiri, tetapi interface method tidak bisa, dan generic method tidak dapat mengimplementasikannya; saya akan memverifikasi batasan tersebut dengan interface konkret dan generic function. Eksperimen ini akan mengukur keterbacaan, inferensi, waktu kompilasi, dan perilaku alat, bukan memublikasikan sintaks draft ke konsumen stabil. Setiap ketidakkonsistenan pada kompilator, pemenuhan interface, atau kode yang dihasilkan akan menghentikan eksperimen dan mempertahankan implementasi yang stabil.”
Jawaban mendalam langkah demi langkah
1. Konfirmasikan fakta versi dan tujuan eksperimen
Catat tanggal halaman resmi, status draft, dan rilis yang diharapkan daripada memperlakukan catatan yang sedang dikerjakan sebagai spesifikasi. Ubah tujuan menjadi hipotesis yang dapat diukur, seperti berkurangnya helper tingkat paket, inferensi call-site yang lebih jelas, atau ekspresi struktur data internal yang lebih baik. “Generic method lebih bagus” bukanlah kriteria kelulusan.
2. Pisahkan tiga batasan type-parameter
Suatu tipe dapat mendeklarasikan type parameter-nya, suatu fungsi dapat mendeklarasikan parameter yang diinferensikan di call-site, dan fitur generic-method dalam draft memungkinkan method mendeklarasikan parameternya sendiri. Interface method tetap tidak dapat mendeklarasikan type parameter, dan sebuah interface tidak mendapatkan generic method hanya karena tipe konkret menyediakannya. Tunjukkan contoh yang berhasil dikompilasi dan yang sengaja gagal agar kegagalan dipahami sebagai aturan bahasa, bukan bug perkakas.
type Box[T any] struct {
value T
}
// Go 1.27 draft syntax; do not publish from a stable Go 1.26 module.
func (b Box[T]) Convert[U any](fn func(T) U) U {
return fn(b.value)
}
type Converter interface {
// Interface methods cannot declare their own type parameters.
Convert(/* generic method is not allowed here */)
}Sintaks method ditampilkan hanya untuk membingkai diskusi draft. Eksperimen nyata harus menggunakan kompilator yang dirilis dan catatan rilisnya; interface yang dikomentari bukanlah API publik yang dapat dikompilasi.
3. Isolasi kode draft dalam modul terpisah
Tempatkan eksperimen di direktorinya sendiri dan go.mod, kunci toolchain, dan cegah modul stabil bergantung padanya. Library publik tetap dibangun dengan Go 1.26. Modul eksperimental dapat menggunakan kompilator draft, tetapi artefaknya tidak boleh masuk ke paket stabil, template yang dihasilkan, atau interface lintas-modul. Menghapus eksperimen seharusnya hanya memerlukan penghapusan modul dan CI job, bukan menulis ulang kode konsumen.
4. Bangun matriks kompilator dan perkakas
Cakup kompilator Go 1.26 yang stabil, toolchain yang digunakan untuk draft, go vet, penganalisis statis, server bahasa IDE, dan platform target. Periksa inferensi, diagnostik, waktu kompilasi, perilaku cache, kompilasi silang (cross-compilation), dokumentasi, dan generator. Generic method dapat berhasil dikompilasi sementara pemformat, penganalisis, atau generator belum sepenuhnya mendukungnya.
5. Uji interface dan fungsi alih-alih asumsi
Untuk setiap kasus, catat hasil yang diharapkan (berhasil atau gagal kompilasi): pemanggilan method konkret, generic function tingkat paket, penetapan interface, method value, method expression, dan refleksi. Pengujian harus membuktikan apakah kompleksitas pemanggil benar-benar berkurang. Jika interface masih memerlukan adaptor, fitur tersebut mungkin hanya memindahkan sintaks tanpa mengurangi kopling.
6. Tetapkan kriteria keluar dan rilis
Hentikan jika semantik draft berubah, kompilator mengalami crash, perkakas tidak dapat memproses kode, API publik membocorkan perubahan versi minimum, atau tolok ukur (benchmark) tidak menunjukkan manfaat yang dapat diulang. Pertahankan implementasi yang stabil, feature switch, dan baseline perbandingan. Jangan mengubah direktif go modul utama atau API publik sebelum rilis final dan tinjauan migrasi. Catat versi kompilator, commit hash, dan batasan yang diketahui.
Contoh jawaban berkualitas tinggi
Pertama-tama saya akan mengonfirmasi bahwa halaman Go 1.27 masih berstatus draft, lalu menempatkan eksperimen generic-method dalam modul dan CI job terpisah. Jawaban harus menyatakan bahwa method dapat mendeklarasikan type parameter, sedangkan interface method tidak dapat dan tidak dapat diimplementasikan oleh generic method. Saya akan menguji pemanggilan konkret, generic function tingkat paket, penetapan interface, method value, dan perkakas; library stabil akan terus dibangun dengan Go 1.26, dan tidak ada sintaks draft yang boleh masuk ke API publik, kode yang dihasilkan, atau artefak rilisnya. Hanya setelah rilis final, dukungan kompilator dan perkakas lengkap, benchmark yang dapat diulang, serta tinjauan kompatibilitas, barulah saya akan mendiskusikan migrasi; jika tidak, saya akan menutup eksperimen dan mempertahankan implementasi yang stabil.
Kesalahan umum
- Memperlakukan draft catatan rilis sebagai spesifikasi yang stabil → Semantik dan sintaks dapat berubah → Catat statusnya dan isolasi eksperimen.
- Mengasumsikan interface method dapat mendeklarasikan type parameter → Ini melanggar batasan yang terdokumentasi → Uji interface konkret dan generic function secara terpisah.
- Membuat modul Go 1.26 bergantung pada eksperimen → Persyaratan toolchain minimum naik tanpa disadari → Jaga agar modul stabil dan eksperimental terisolasi satu arah.
- Hanya memeriksa keberhasilan kompilator → vet, IDE, generator, atau kompilasi silang bisa gagal → Jalankan matriks perkakas yang lengkap.
- Menghapus implementasi yang stabil demi sintaks baru → Draft yang ditarik tidak menyisakan opsi rollback → Pertahankan implementasi pembanding, tombol pengalih (switch), dan kriteria keluar.
Pertanyaan lanjutan dan tanggapan
Apa perbedaan mendasar antara generic method dan generic function?
Sebuah generic function mendeklarasikan type parameter pada fungsi tingkat paket. Sebuah generic method mendeklarasikan type parameter-nya sendiri pada method dari tipe penerima (receiver type). Namespace method dapat lebih cocok dengan call-site, tetapi tidak otomatis mengubah aturan interface.
Mengapa interface method tidak bisa begitu saja mengikuti generic method?
Pemenuhan interface membutuhkan method set yang stabil dan dapat dibandingkan. Draft resmi menyatakan interface method tidak dapat mendeklarasikan type parameter dan tidak dapat diimplementasikan oleh generic method, sehingga batasan tersebut harus menggunakan method konkret, adaptor, atau generic function tingkat paket.
Bagaimana Anda membuktikan bahwa eksperimen tidak bocor ke modul yang stabil?
Build modul Go 1.26 secara independen, periksa grafik dependensinya, paket yang dihasilkan, dan artefak rilis, larang impor jalur eksperimen di CI, serta audit simbol publik dan direktif versi.
Apakah keberhasilan kompilator saja sudah cukup?
Tidak. Verifikasi gofmt, vet, penganalisis, dukungan IDE, generator, kompilasi silang, dokumentasi, dan benchmark karena draft dapat mendarat di kompilator sebelum bagian toolchain lainnya siap.
Kapan proyek produksi dapat bermigrasi?
Setelah rilis final, perilaku bahasa dan perkakas stabil, matriks interface dan build lolos, manfaat terbukti secara berulang, jalur rollback tersedia, komunikasi dengan konsumen dilakukan, dan kebijakan versi ditinjau, mulailah dengan migrasi kecil.