0Pricing
Go Academy · Ders

Dinamik İşlev Çağrıları

reflect aracılığıyla işlevleri çağırma ve değerleri ayarlama

Dinamik İşlev Çağrıları, CoddyKit'te ücretsiz bir Go Academy dersidir. Bu, 4 dersinin 3. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Go Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Go Academy kursu toplamda 4 dersten oluşur.

reflect.Value.Call

Value.Call(args), Value tarafından temsil edilen işlevi verilen bağımsız değişkenlerle (bir []reflect.Value olarak) çağırır ve sonuçları []reflect.Value olarak döndürür.

fn := reflect.ValueOf(add)
results := fn.Call([]reflect.Value{
    reflect.ValueOf(2),
    reflect.ValueOf(3),
})
fmt.Println(results[0].Int()) // 5

Bağımsız değişken türlerini denetleme

Çağrı yapmadan önce bağımsız değişken türlerinin işlev imzasıyla eşleştiğinden emin olun. Eşleşmeyen türler bir paniğe neden olur.

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") }
}

Değişken sayıda bağımsız değişken alan işlevler

Değişken sayıda bağımsız değişken alan bir işlevi Value.Call ile (dilim açılarak) veya Value.CallSlice ile (değişken bağımsız değişkenler dilim değeri olarak geçirilerek) çağırın:

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, çalışma zamanında verilen bir tür ve sarmalayıcı gövdesiyle yeni bir işlev oluşturur. Arayüzler için uyarlayıcı işlevler oluşturmak amacıyla kullanılır.

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)))}
})

Yöntemleri adına göre çağırma

Bir yöntemi adına göre alın ve çağırın:

v := reflect.ValueOf(myObj)
m := v.MethodByName("Process")
if m.IsValid() {
    m.Call(nil)
}

Yöntemin mevcut olup olmadığını denetleme

Çağrı yapmadan önce her zaman m.IsValid() denetimini gerçekleştirin; yöntem bulunamadığında MethodByName sıfır Value döndürür ve sıfır Value çağrıldığında panik oluşur.

Dinamik gönderim kullanım alanları

Dinamik işlev çağrıları şuralarda kullanılır: eklenti sistemleri (işlevleri dize adlarıyla çağırma), sınama çatıları (TestXxx işlevlerini çağırma), RPC göndericileri (yöntem adlarını işleyicilerle eşleme) ve dekoratörler.

Başarım

reflect.Call, doğrudan çağrıdan yaklaşık 10-50 kat daha yavaştır. Sık çağrılan işlevlerin reflect.Value değerini önbelleğe alın; yoğun döngülerde kullanmaktan kaçının.

Tür güvenli sarmalayıcı

Dinamik çağrıları, yansıtma işlemlerini başlangıç sırasında bir kez gerçekleştiren ve önbelleğe alınmış Value değerini tekrar tekrar çağıran, türü belirlenmiş bir yardımcıyla sarın:

type Processor func(context.Context, []byte) ([]byte, error)
// Build at startup, reuse at request time

Hata dönüşünü işleme

İşlev son sonucu olarak bir hata döndürüyorsa bu sonucu çıkarın ve denetleyin:

results := fn.Call(args)
if !results[len(results)-1].IsNil() {
    return results[len(results)-1].Interface().(error)
}

Yansıtma yerine seçenekler

İşlev kümesi derleme zamanında biliniyorsa, yansıtma yerine bir işlev değerleri haritası (map[string]func(...)) kullanın; bu yöntem daha güvenli ve daha hızlıdır.

handlers := map[string]func(ctx context.Context, req []byte) []byte{
    "greet": greetHandler,
}

Hızlı kontrol

reflect.Value.Call ne döndürür?

Özet: Dinamik işlev çağrıları

Ana noktalar:

  • Value.Call([]reflect.Value) işlevi çağırır; []reflect.Value döndürür
  • MethodByName sonucunu çağırmadan önce m.IsValid() denetimini gerçekleştirin
  • MakeFunc, çalışma zamanında verilen bir türle yeni bir işlev oluşturur
  • Bilinen işlev kümeleri için yansıtma yerine map[string]func kullanmayı tercih edin

Sıkça Sorulan Sorular

“Dinamik İşlev Çağrıları” dersi ücretsiz mi?

Evet — “Dinamik İşlev Çağrıları” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Go Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Go Academy kursu toplamda 4 dersten oluşur.

“Dinamik İşlev Çağrıları” dersinde ne öğreneceğim?

reflect aracılığıyla işlevleri çağırma ve değerleri ayarlama Go Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

Go Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te Go Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 3. dersidir.

“Dinamik İşlev Çağrıları” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu Go Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her Go Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. reflect.Type ve reflect.Value
  2. Yapı Alanlarını ve Etiketlerini İnceleme
  3. Dinamik İşlev Çağrıları
  4. Uygulamalı Yansıma: Serileştiriciler
← Go Academy Sayfasına Dön