CodeBlanks Logo Icon CodeBlanks

Özet - Reflection

reflect.Type ve Value'yu birleştirerek bir yapı yazıcı yazarsın.

Reflection özeti

Bu grupta TypeOf ile türü ve çeşidi, ValueOf ile içeriği okudun; işaretçi ve Elem ile değeri değiştirdin; NumField ile struct alanlarını gezdin ve MethodByName ile yöntem çağırdın.

t := reflect.TypeOf(v)   // ne?
val := reflect.ValueOf(v) // içinde ne var?

Kural: önce arayüz ve generic'leri düşün, reflect'i genel araçlar için sakla.

Etiketle alan okuma

Gerçek bir örnek: struct alanlarını etiketlerine göre yazdıran küçük bir kodlayıcı.

for i := 0; i < t.NumField(); i++ {
    f := t.Field(i)
    fmt.Printf("%s=%v\n", f.Tag.Get("ad"), v.Field(i))
}

JSON, YAML ve veritabanı kütüphaneleri temelde bu döngüyü kullanır.

Uygulama Etiketlerle yazdır

type Ayar struct { Port int `ad:"port"`; Mod string `ad:"mod"` } tanımla. Ayar{8080, "test"} için her alanı etiket=değer biçiminde ayrı satırda yazdır (Tag.Get("ad") kullan).

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 Ayar struct {
    Port int    `ad:"port"`
    Mod  string `ad:"mod"`
}

func main() {
    a := Ayar{8080, "test"}
    t, v := reflect.TypeOf(a), reflect.ValueOf(a)
    for i := 0; i < t.NumField(); i++ {
        fmt.Printf("%s=%v\n", t.Field(i).Tag.Get("ad"), v.Field(i))
    }
}

Beklenen çıktı

port=8080
mod=test

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 Bir değişkeni reflect ile değiştirmek için ne gerekir?

  • Değişkenin işaretçisini verip Elem() kullanmak Doğru cevap
  • Değişkeni doğrudan ValueOf'a vermek
  • TypeOf ile türünü almak
  • NumField çağırmak

Açıklama: ValueOf(x) bir kopya alır ve ayarlanamaz; ValueOf(&x).Elem() asıl değişkene ulaşır.

2 Etiketi oku

Soru
f := t.Field(0)
fmt.Println(f.Tag.____("json"))
Cevap
f := t.Field(0)
fmt.Println(f.Tag.Get("json"))

Açıklama: Tag.Get anahtara karşılık gelen etiket değerini döndürür.

3 Grubun özeti

Kavram Anlamı
TypeOf Tür ve çeşit
ValueOf İçerik
Elem + SetInt Değeri değiştirme
MethodByName + Call Dinamik çağrı

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