Dinamik çağrı
- Go kursu
- İleri seviye
- Ders 5/68
- 4 dk
reflect ile fonksiyon ve metodu dinamik çağırmayı öğrenirsin.
Yöntemi adıyla çağırmak
MethodByName("Ad") bir değerin yöntemini metin olarak verilen adla bulur; Call onu çalıştırır. Argümanlar ve dönüş değerleri []reflect.Value olarak taşınır.
m := reflect.ValueOf(h).MethodByName("Topla")
out := m.Call([]reflect.Value{reflect.ValueOf(2), reflect.ValueOf(3)})
fmt.Println(out[0].Int()) // 5Komut adlarını yöntemlere bağlayan eklenti sistemleri böyle çalışır.
Yalnızca dışa aktarılmış yöntemler
Reflect yalnızca büyük harfle başlayan yöntemleri görür. Ayrıca yöntem işaretçi alıcıyla (func (h *Hesap)) tanımlandıysa değeri reflect.ValueOf(&h) olarak vermelisin.
fmt.Println(reflect.TypeOf(&h).NumMethod()) // dışa aktarılmış yöntem sayısıUygulama Adıyla çağır
type Hesap struct{} ve func (Hesap) Kare(n int) int { return n * n } tanımla. MethodByName("Kare") ile yöntemi bul, 4 argümanıyla Call et ve sonucun Int() değerini yazdır.
Başlangıç kodu
package main
import (
"fmt"
"reflect"
)
func main() {
// buraya yaz
}Örnek çözüm
package main
import (
"fmt"
"reflect"
)
type Hesap struct{}
func (Hesap) Kare(n int) int { return n * n }
func main() {
m := reflect.ValueOf(Hesap{}).MethodByName("Kare")
out := m.Call([]reflect.Value{reflect.ValueOf(4)})
fmt.Println(out[0].Int())
}Beklenen çıktı
16
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 Yöntem bulunamazsa <code>MethodByName</code> ne döndürür?
- Boş bir dilim
- Geçersiz (IsValid() false olan) bir Value Doğru cevap
- nil error
- Derleme hatası
Açıklama: Bulunamayan yöntem için sıfır Value döner; Call etmeden önce IsValid() ile kontrol etmezsen panic olur.
2 Yöntemi çalıştır
m := reflect.ValueOf(s).MethodByName("Selam")
m.____(nil)
m := reflect.ValueOf(s).MethodByName("Selam")
m.Call(nil)
Açıklama: Call yöntemi verilen argüman dilimiyle çalıştırır; argüman yoksa nil verilebilir.
3 Dinamik çağrı parçaları
| Kavram | Anlamı |
|---|---|
MethodByName |
Yöntemi adıyla bulur |
Call |
Yöntemi çalıştırır |
[]reflect.Value |
Argüman ve sonuç listesi |
IsValid() |
Bulundu mu kontrolü |