Generik dalam Praktik: Jebakan
Kapan menggunakan generik dan kesalahan umum
Generik dalam Praktik: Jebakan adalah pelajaran Go Academy gratis di CoddyKit. Ini adalah pelajaran 4 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Go Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Go Academy mencakup 4 pelajaran total.
Menggenerikkan secara berlebihan
Tidak setiap fungsi perlu bersifat generik. Jika hanya ada satu tipe konkret yang akan digunakan, generik menambah kompleksitas tanpa manfaat. Utamakan tipe konkret dan ubah menjadi generik ketika duplikasi mulai muncul.
Asersi tipe di dalam generik
Anda tidak dapat melakukan asersi tipe atau switch tipe di dalam fungsi generik pada parameter tipe itu sendiri — generik bukanlah templat. Gunakan antarmuka atau paket reflect sebagai gantinya.
// WRONG:
func Foo[T any](v T) {
if x, ok := v.(int); ok { // compile error
}
}comparable tidak berarti Ordered
comparable hanya mendukung ==. Untuk menggunakan <, >, Anda memerlukan cmp.Ordered atau kendala kustom. Kesalahan umum adalah mengira comparable mencakup pengurutan.
Metode tidak dapat memperkenalkan parameter tipe
Metode pada tipe generik menggunakan kembali parameter tipe milik tipe tersebut, tetapi tidak dapat menambahkan parameter baru. Jika sebuah metode memerlukan parameter tipe tambahan, gunakan fungsi tingkat atas sebagai gantinya.
// WRONG:
func (s *Stack[T]) MapTo[U any]() []U // compile errorNilai nil dan nol
Untuk parameter tipe penunjuk, nilai nolnya adalah nil. Untuk tipe nilai, nilai tersebut adalah nilai nol tipe itu. Selalu tangani kasus nilai nol, jangan berasumsi bahwa nilainya bukan nil.
Kumpulan metode antarmuka dan generik
Fungsi generik yang dibatasi oleh sebuah antarmuka hanya dapat memanggil metode yang dideklarasikan dalam antarmuka tersebut. Menambahkan metode ke tipe konkret tidak membuat metode itu tersedia melalui kendala.
Pembengkakan instansiasi (bentuk GC)
Go berbagi implementasi untuk tipe dengan bentuk GC yang sama (misalnya, semua tipe penunjuk berbagi satu implementasi). Setiap tipe primitif mendapatkan implementasinya sendiri — tetapi pendekatan Go menjaga ukuran biner tetap wajar.
any bukan interface{}
any adalah alias untuk interface{}, tetapi fungsi generik F[T any] tidak sama dengan F(v interface{}) — dalam fungsi generik, T adalah tipe konkret di lokasi pemanggilan, sehingga informasi tipe tetap terjaga.
Tipe generik rekursif
Go tidak mendukung definisi parameter tipe rekursif seperti type Tree[T Tree[T]]. Gunakan komposisi sebagai gantinya:
type TreeNode[T any] struct {
Val T
Left *TreeNode[T]
Right *TreeNode[T]
}Pembantu yang telah diinstansiasi sebelumnya
Untuk kode yang sensitif terhadap performa, lakukan instansiasi sebelumnya pada fungsi generik yang sering digunakan sebagai fungsi tingkat atas untuk menghindari overhead inferensi tipe berulang (meskipun kompilator Go menanganinya dengan baik).
Menguji kode generik
Uji fungsi generik dengan beberapa instansiasi: satu untuk setiap kendala yang berbeda (int, string, tipe kustom). Hal ini menangkap kasus khusus yang bergantung pada kendala.
func TestMap(t *testing.T) {
got := Map([]int{1,2}, double)
// test with strings too
gotS := Map([]string{"a","b"}, strings.ToUpper)
}Pemeriksaan Cepat
Mengapa Anda NOT dapat melakukan switch tipe pada parameter tipe generik T di dalam fungsi generik?
Rangkuman: Kendala Generik
Poin penting:
- Jangan menggenerikkan secara berlebihan; tipe konkret lebih sederhana jika hanya digunakan sekali
- Tidak ada switch/asersi tipe pada T di dalam fungsi generik
- comparable ≠ terurut; gunakan cmp.Ordered untuk mendukung <
- Metode tidak dapat memperkenalkan parameter tipe baru
Belajar Go dengan tutor AI — gratis
Tulis dan jalankan kode asli di browser kamu, dapatkan bantuan instan dari tutor AI 24/7, dan lanjutkan di mana kamu tinggalkan di web atau aplikasi.
- Kursus
- 51
- Pelajaran
- 203
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Generik dalam Praktik: Jebakan” gratis?
Ya — teks lengkap “Generik dalam Praktik: Jebakan” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Go Academy, upgrade ke CoddyKit PRO. Kursus Go Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Generik dalam Praktik: Jebakan”?
Kapan menggunakan generik dan kesalahan umum Kamu berlatih Go Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai Go Academy?
Tidak diperlukan pengalaman sebelumnya. Go Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 4 dari 4.
Berapa lama pelajaran “Generik dalam Praktik: Jebakan” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran Go Academy ini?
Ya. Setiap pelajaran Go Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Sintaks Parameter Tipe
- Batasan: comparable dan Interface
- Struktur Data Generik
- Generik dalam Praktik: Jebakan