CodeBlanks Logo Icon CodeBlanks

Dinamik çağrı

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())  // 5

Komut 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

main.go
package main

import (
    "fmt"
    "reflect"
)

func main() {
    // buraya yaz
}

Örnek çözüm

main.go
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

Soru
m := reflect.ValueOf(s).MethodByName("Selam")
m.____(nil)
Cevap
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ü

İleri seviye bölümündeki tüm dersler