Pemanggilan Fungsi Dinamis
Memanggil fungsi dan menetapkan nilai melalui reflect
Pemanggilan Fungsi Dinamis adalah pelajaran Go Academy gratis di CoddyKit. Ini adalah pelajaran 3 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.
reflect.Value.Call
Value.Call(args) memanggil fungsi yang direpresentasikan oleh Value dengan argumen yang diberikan (sebagai []reflect.Value), lalu mengembalikan hasilnya sebagai []reflect.Value.
fn := reflect.ValueOf(add)
results := fn.Call([]reflect.Value{
reflect.ValueOf(2),
reflect.ValueOf(3),
})
fmt.Println(results[0].Int()) // 5Pemeriksaan tipe argumen
Pastikan tipe argumen cocok dengan tanda tangan fungsi sebelum memanggilnya. Tipe yang tidak cocok menyebabkan panic.
t := reflect.TypeOf(fn)
if t.NumIn() != len(args) { panic("wrong arg count") }
for i, arg := range args {
if !reflect.TypeOf(arg).AssignableTo(t.In(i)) { panic("type mismatch") }
}Fungsi variadik
Panggil fungsi variadik dengan Value.Call (menyebarkan irisan) atau Value.CallSlice (meneruskan argumen variadik sebagai nilai irisan):
sum := reflect.ValueOf(func(ns ...int) int {
total := 0
for _, n := range ns { total += n }
return total
})
args := reflect.ValueOf([]int{1,2,3})
results := sum.CallSlice([]reflect.Value{args})reflect.MakeFunc
reflect.MakeFunc membuat fungsi baru saat runtime dengan tipe tertentu dan isi pembungkus. Ini digunakan untuk membuat fungsi adaptor bagi antarmuka.
t := reflect.TypeOf(func(int) string { return "" })
fn := reflect.MakeFunc(t, func(args []reflect.Value) []reflect.Value {
return []reflect.Value{reflect.ValueOf(strconv.Itoa(args[0].Interface().(int)))}
})Memanggil metode berdasarkan nama
Ambil metode berdasarkan nama lalu panggil:
v := reflect.ValueOf(myObj)
m := v.MethodByName("Process")
if m.IsValid() {
m.Call(nil)
}Memeriksa keberadaan metode
Selalu periksa m.IsValid() sebelum memanggil — MethodByName mengembalikan Value nol jika metode tidak ditemukan, dan pemanggilan Value nol akan menyebabkan panic.
Kasus penggunaan pemanggilan dinamis
Pemanggilan fungsi dinamis digunakan dalam: sistem pengaya (memanggil fungsi berdasarkan nama string), kerangka kerja pengujian (memanggil fungsi TestXxx), pengarah RPC (memetakan nama metode ke penangan), dan dekorator.
Kinerja
reflect.Call sekitar 10–50× lebih lambat daripada pemanggilan langsung. Simpan cache reflect.Value dari fungsi yang sering dipanggil; hindari penggunaannya dalam loop panas.
Pembungkus yang aman terhadap tipe
Bungkus pemanggilan dinamis dalam pembantu bertipe yang menjalankan mekanisme refleksi sekali saat startup, lalu memanggil Value yang tersimpan di cache berulang kali:
type Processor func(context.Context, []byte) ([]byte, error)
// Build at startup, reuse at request timePenanganan pengembalian kesalahan
Jika fungsi mengembalikan kesalahan sebagai hasil terakhir, ekstrak dan periksa hasil tersebut:
results := fn.Call(args)
if !results[len(results)-1].IsNil() {
return results[len(results)-1].Interface().(error)
}Alternatif untuk refleksi
Jika kumpulan fungsi diketahui saat kompilasi, gunakan peta nilai fungsi (map[string]func(...)) sebagai pengganti refleksi — cara ini lebih aman dan cepat.
handlers := map[string]func(ctx context.Context, req []byte) []byte{
"greet": greetHandler,
}Pemeriksaan Singkat
Apa yang dikembalikan oleh reflect.Value.Call?
Ringkasan: Pemanggilan Fungsi Dinamis
Poin-poin penting:
- Value.Call([]reflect.Value) memanggil fungsi; mengembalikan []reflect.Value
- Periksa m.IsValid() sebelum memanggil hasil MethodByName
- MakeFunc membuat fungsi baru dengan tipe tertentu saat runtime
- Lebih baik gunakan map[string]func daripada refleksi untuk kumpulan fungsi yang diketahui
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Pemanggilan Fungsi Dinamis” gratis?
Ya — teks lengkap “Pemanggilan Fungsi Dinamis” 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 “Pemanggilan Fungsi Dinamis”?
Memanggil fungsi dan menetapkan nilai melalui reflect 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 3 dari 4.
Berapa lama pelajaran “Pemanggilan Fungsi Dinamis” 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
- reflect.Type dan reflect.Value
- Memeriksa Field dan Tag Struct
- Pemanggilan Fungsi Dinamis
- Refleksi Praktis: Serializer