Gesaan dan konteks
Pasukan Go menyelenggara beberapa modul. Pustaka awamnya mesti terus dibina dengan Go 1.26, manakala modul eksperimen ingin menilai kaedah generik yang diterangkan dalam nota keluaran Go 1.27. Pasukan berharap dapat meletakkan operasi generik berkaitan jenis dalam ruang nama kaedah tanpa mengubah keserasian antara muka, keperluan rantaian alat (toolchain), atau saluran paip keluaran. Terangkan sempadan bahasa, reka bentuk eksperimen, matriks binaan, dan syarat keluar.
Halaman Go secara jelas melabelkan nota 1.27 sebagai draf, menyatakan bahawa keluaran tersebut belum tersedia, dan menjangkakan keluaran pada Ogos 2026. Ia menerangkan kaedah yang mengisytiharkan parameter jenisnya sendiri, sambil menyatakan bahawa kaedah antara muka tidak boleh mengisytiharkan parameter jenis dan tidak boleh dilaksanakan oleh kaedah generik. Anggap ini sebagai kekangan pra-keluaran, bukan jaminan bahasa yang stabil.
Perkara yang dinilai oleh penemu duga
Penemu duga sedang menguji sama ada anda boleh membezakan parameter jenis pada jenis, fungsi, dan kaedah, dan sama ada anda memahami bahawa kaedah yang kelihatan lebih generik tidak secara automatik memenuhi antara muka. Jawapan yang kukuh mencadangkan eksperimen minimum, matriks pengkompil dan go.mod, pengasingan API awam, pengunduran (rollback), dan rekod perubahan draf.
Soalan penjelasan untuk ditanya
- Adakah matlamatnya adalah kebolehekspresian pemanggil, inferens jenis, atau penggunaan semula pelaksanaan dalaman?
- Bolehkah kod eksperimen diimport oleh modul stabil, penjana, pemalam, atau pengguna luaran?
- Apakah versi Go minimum, permukaan antara muka, dan kekerapan keluaran untuk API awam?
- Pengkompil, penganalisis, IDE, dan platform CI yang manakah mesti disahkan?
- Jika draf dinamakan semula, ditarik balik, atau diubah secara semantik, bolehkah eksperimen dipadamkan tanpa mengubah modul yang stabil?
Jawapan 30 saat
“Saya akan melabelkan Go 1.27 sebagai draf dan meletakkan eksperimen dalam modul dan kerja CI yang terasing tanpa mengubah API awam Go 1.26. Kaedah generik boleh mengisytiharkan parameter jenisnya sendiri, tetapi kaedah antara muka tidak boleh, dan kaedah generik tidak boleh melaksanakannya; saya akan mengesahkan sempadan tersebut dengan antara muka konkrit dan fungsi generik. Eksperimen ini akan mengukur kebolehbacaan, inferens, masa penyusunan, dan tingkah laku alat, bukannya menerbitkan sintaks draf kepada pengguna yang stabil. Sebarang ketidakkonsistenan pengkompil, kepuasan antara muka, atau kod yang dijana akan menutup eksperimen dan mengekalkan pelaksanaan yang stabil.”
Jawapan terperinci langkah demi langkah
1. Sahkan fakta versi dan matlamat eksperimen
Catatkan tarikh halaman rasmi, status draf, dan keluaran yang dijangkakan daripada menganggap nota kerja dalam proses sebagai spesifikasi. Tukarkan matlamat kepada hipotesis yang boleh diukur, seperti pengurangan pembantu peringkat pakej, inferens tapak panggilan yang lebih jelas, atau ekspresi struktur data dalaman yang lebih baik. “Kaedah generik adalah lebih elok” bukanlah kriteria lulus.
2. Pisahkan tiga sempadan parameter jenis
Sesuatu jenis boleh mengisytiharkan parameter jenisnya, sesuatu fungsi boleh mengisytiharkan parameter yang disimpulkan di tapak panggilan, dan ciri kaedah generik draf membolehkan sesuatu kaedah mengisytiharkan parameternya sendiri. Kaedah antara muka masih tidak boleh mengisytiharkan parameter jenis, dan antara muka tidak memperoleh kaedah generik semata-mata kerana jenis konkrit menyediakannya. Tunjukkan kedua-dua contoh yang berjaya dikompil dan yang sengaja gagal supaya kegagalan difahami sebagai peraturan bahasa dan bukannya pepijat alatan.
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 kaedah ditunjukkan hanya untuk membingkai perbincangan draf. Eksperimen sebenar mesti menggunakan pengkompil yang dikeluarkan dan nota keluarannya; antara muka yang dikomen bukan API awam yang boleh dikompil.
3. Asingkan kod draf dalam modul berasingan
Letakkan eksperimen dalam direktori tersendiri dan go.mod, pinkan rantaian alat, dan halang modul stabil daripada bergantung padanya. Pustaka awam terus dibina dengan Go 1.26. Modul eksperimen boleh menggunakan pengkompil draf, tetapi artifaknya tidak boleh memasuki pakej yang stabil, templat yang dijana, atau antara muka silang modul. Mengalih keluar eksperimen hanya perlu melibatkan pemadaman modul dan kerja CI, bukan menulis semula kod pengguna.
4. Bina matriks pengkompil dan alatan
Rangkumi pengkompil Go 1.26 yang stabil, rantaian alat yang digunakan untuk draf, go vet, penganalisis statik, pelayan bahasa IDE, dan platform sasaran. Periksa inferens, diagnostik, masa penyusunan, tingkah laku cache, penyusunan silang, dokumentasi, dan penjana. Kaedah generik boleh dikompil sementara pemformat, penganalisis, atau penjana masih kekurangan sokongan penuh.
5. Uji antara muka dan fungsi dan bukannya andaian
Bagi setiap kes, catatkan hasil jangkaan sama ada berjaya atau gagal dikompil: panggilan kaedah konkrit, fungsi generik peringkat pakej, penyerahan antara muka, nilai kaedah, ekspresi kaedah, dan pantulan (reflection). Ujian harus membuktikan sama ada kerumitan pemanggil benar-benar berkurangan. Jika antara muka masih memerlukan penyesuai, ciri tersebut mungkin hanya mengalihkan sintaks tanpa mengurangkan gandingan (coupling).
6. Tetapkan pintu keluar dan pelepasan
Berhenti jika semantik draf berubah, pengkompil ranap, alatan tidak dapat memproses kod, API awam membocorkan perubahan versi minimum, atau penanda aras (benchmark) menunjukkan tiada faedah yang boleh diulang. Kekalkan pelaksanaan yang stabil, suis ciri (feature switch), dan garis dasar perbandingan. Jangan ubah arahan go modul utama atau API awam sebelum keluaran akhir dan semakan migrasi. Rekodkan versi pengkompil, cincangan komit (commit hashes), dan batasan yang diketahui.
Contoh jawapan berkualiti tinggi
Saya mula-mula akan mengesahkan bahawa halaman Go 1.27 masih draf, kemudian meletakkan eksperimen kaedah generik dalam modul dan kerja CI yang berasingan. Jawapan mesti menyatakan bahawa kaedah boleh mengisytiharkan parameter jenis, manakala kaedah antara muka tidak boleh dan tidak boleh dilaksanakan oleh kaedah generik. Saya akan menguji panggilan konkrit, fungsi generik peringkat pakej, penyerahan antara muka, nilai kaedah, dan alatan; pustaka yang stabil akan terus dibina dengan Go 1.26, dan tiada sintaks draf boleh memasuki API awamnya, kod yang dijana, atau artifak keluaran. Hanya selepas keluaran akhir, sokongan pengkompil dan alat, penanda aras yang boleh diulang, dan semakan keserasian barulah saya membincangkan migrasi; jika tidak, saya akan menutup eksperimen dan mengekalkan pelaksanaan yang stabil.
Kesilapan lazim
- Menganggap nota keluaran draf sebagai spesifikasi yang stabil → Semantik dan sintaks boleh berubah → Rekodkan status dan asingkan eksperimen.
- Menganggap kaedah antara muka boleh mengisytiharkan parameter jenis → Ia melanggar sempadan yang didokumenkan → Uji antara muka konkrit dan fungsi generik secara berasingan.
- Menjadikan modul Go 1.26 bergantung pada eksperimen → Keperluan rantaian alat minimum meningkat secara senyap → Kekalkan modul stabil dan eksperimen diasingkan secara sehala.
- Hanya memeriksa kejayaan pengkompil → vet, IDE, penjana, atau penyusunan silang boleh gagal → Jalankan matriks alatan yang lengkap.
- Memadamkan pelaksanaan yang stabil demi sintaks baharu → Draf yang ditarik balik tidak meninggalkan jalan pengunduran → Kekalkan pelaksanaan perbandingan, suis, dan pintu keluar.
Soalan susulan dan jawapan
Apakah perbezaan teras antara kaedah generik dan fungsi generik?
Fungsi generik mengisytiharkan parameter jenis pada fungsi peringkat pakej. Kaedah generik mengisytiharkan parameter jenisnya sendiri pada kaedah jenis penerima. Ruang nama kaedah boleh memadankan tapak panggilan dengan lebih baik, tetapi ia tidak secara automatik mengubah peraturan antara muka.
Mengapakah kaedah antara muka tidak boleh mengikut kaedah generik begitu sahaja?
Kepuasan antara muka memerlukan set kaedah yang stabil dan boleh dibandingkan. Draf rasmi menyatakan bahawa kaedah antara muka tidak boleh mengisytiharkan parameter jenis dan tidak boleh dilaksanakan oleh kaedah generik, jadi sempadan mesti menggunakan kaedah konkrit, penyesuai, atau fungsi generik peringkat pakej.
Bagaimanakah anda membuktikan bahawa eksperimen tidak bocor ke dalam modul yang stabil?
Bina modul Go 1.26 secara bebas, periksa graf kebergantungannya, pakej yang dijana, dan artifak keluaran, larang pengimportan laluan eksperimen dalam CI, dan audit simbol awam serta arahan versi.
Adakah kejayaan pengkompil sudah mencukupi?
Tidak. Sahkan gofmt, vet, penganalisis, sokongan IDE, penjana, penyusunan silang, dokumentasi, dan penanda aras kerana draf boleh mendarat dalam pengkompil sebelum baki rantaian alat sedia.
Bilakah projek pengeluaran boleh berhijrah?
Selepas keluaran akhir, tingkah laku bahasa dan alatan yang stabil, matriks antara muka dan binaan yang lulus, faedah yang boleh diulang, laluan pengunduran, komunikasi pengguna, dan dasar versi yang disemak, mulakan dengan migrasi kecil.