Generik dalam Amalan: Perangkap
Bila perlu menggunakan generik dan kesilapan umum
Generik dalam Amalan: Perangkap ialah pelajaran Go Academy percuma di CoddyKit. Ini ialah pelajaran 4 daripada 4. Sebanyak 3 pelajaran dalam laluan pembelajaran ini boleh dibaca sepenuhnya secara percuma — selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan praktikal dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Go Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Go Academy merangkumi sejumlah 4 pelajaran.
Penggenerikan berlebihan
Tidak setiap fungsi perlu bersifat generik. Jika hanya satu jenis konkrit yang akan digunakan, generik menambah kerumitan tanpa manfaat. Utamakan jenis konkrit dan ubah kepada generik apabila penduaan muncul.
Penegasan jenis dalam generik
Anda tidak boleh melakukan penegasan jenis atau pensuisan jenis dalam fungsi generik pada parameter jenis itu sendiri — generik bukan templat. Gunakan antara muka atau pakej reflect sebagai ganti.
// WRONG:
func Foo[T any](v T) {
if x, ok := v.(int); ok { // compile error
}
}Comparable bukan Ordered
comparable hanya menyokong ==. Untuk menggunakan < atau >, anda memerlukan cmp.Ordered atau kekangan tersuai. Kesilapan biasa ialah menganggap comparable merangkumi pengurutan.
Kaedah tidak boleh memperkenalkan parameter jenis
Kaedah pada jenis generik menggunakan semula parameter jenis tersebut tetapi tidak boleh menambah parameter baharu. Jika kaedah memerlukan parameter jenis tambahan, gunakan fungsi aras teratas sebagai ganti.
// WRONG:
func (s *Stack[T]) MapTo[U any]() []U // compile errorNilai nil dan sifar
Bagi parameter jenis penuding, nilai sifarnya ialah nil. Bagi jenis nilai, nilai itu ialah sifar bagi jenis tersebut. Sentiasa kendalikan kes sifar dan jangan menganggap nilainya bukan nil.
Set kaedah antara muka dan generik
Fungsi generik yang dikekang kepada antara muka hanya boleh memanggil kaedah yang diisytiharkan dalam antara muka itu. Menambah kaedah pada jenis konkrit tidak menjadikannya tersedia melalui kekangan tersebut.
Penggembungan penginstansan (bentuk GC)
Go berkongsi pelaksanaan untuk jenis yang mempunyai bentuk GC yang sama (contohnya, semua jenis penuding berkongsi satu pelaksanaan). Setiap jenis primitif mendapat pelaksanaannya sendiri — namun pendekatan Go mengekalkan saiz perduaan pada tahap yang munasabah.
Any bukan interface{}
any ialah alias bagi interface{}, tetapi fungsi generik F[T any] tidak sama dengan F(v interface{}) — dalam fungsi generik, T ialah jenis konkrit pada tapak panggilan, lalu mengekalkan maklumat jenis.
Jenis generik rekursif
Go tidak menyokong definisi parameter jenis rekursif seperti type Tree[T Tree[T]]. Gunakan komposisi sebagai ganti:
type TreeNode[T any] struct {
Val T
Left *TreeNode[T]
Right *TreeNode[T]
}Pembantu yang diinstanskan terlebih dahulu
Untuk kod yang sensitif terhadap prestasi, instanskan terlebih dahulu fungsi generik yang kerap digunakan sebagai fungsi aras teratas bagi mengelakkan overhed pemerolehan jenis berulang (walaupun pengkompil Go mengendalikannya dengan baik).
Menguji kod generik
Uji fungsi generik dengan beberapa penginstansan: satu untuk setiap kekangan berbeza (int, string, jenis tersuai). Ini mengesan kes pinggir yang khusus kepada kekangan.
func TestMap(t *testing.T) {
got := Map([]int{1,2}, double)
// test with strings too
gotS := Map([]string{"a","b"}, strings.ToUpper)
}Semakan Pantas
Mengapakah anda TIDAK boleh melakukan pensuisan jenis pada parameter jenis generik T dalam fungsi generik?
Ulang kaji: Perangkap Generik
Perkara utama:
- Jangan menjadikan semuanya generik; jenis konkrit lebih mudah apabila digunakan sekali sahaja
- Tiada pensuisan atau penegasan jenis pada T dalam fungsi generik
- comparable tidak bermaksud tersusun; gunakan cmp.Ordered untuk sokongan <
- Kaedah tidak boleh memperkenalkan parameter jenis baharu
Pelajari Go dengan tutor kecerdasan buatan — percuma
Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.
- Kursus
- 51
- Pelajaran
- 203
Soalan Lazim
Adakah pelajaran “Generik dalam Amalan: Perangkap” percuma?
Ya — sebanyak 3 pelajaran dalam laluan pembelajaran Go Academy, termasuk “Generik dalam Amalan: Perangkap”, boleh dibaca sepenuhnya secara percuma di web ini. Selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan interaktif dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Kursus Go Academy merangkumi sejumlah 4 pelajaran.
Apakah yang akan saya pelajari dalam “Generik dalam Amalan: Perangkap”?
Bila perlu menggunakan generik dan kesilapan umum Anda berlatih Go Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.
Adakah saya memerlukan pengalaman untuk memulakan Go Academy?
Tiada pengalaman terdahulu diperlukan. Pembelajaran Go Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 4 daripada 4.
Berapa lamakah pelajaran “Generik dalam Amalan: Perangkap” diambil?
Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.
Bolehkah saya menulis dan menjalankan kod dalam pelajaran Go Academy ini?
Ya. Setiap pelajaran Go Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.
Semua pelajaran dalam kursus ini
- Sintaks Parameter Jenis
- Kekangan: comparable dan Antara Muka
- Struktur Data Generik
- Generik dalam Amalan: Perangkap