Özet - Reflection
- Go kursu
- İleri seviye
- Ders 6/68
- 4 dk
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
package main
import (
"fmt"
"reflect"
)
func main() {
// buraya yaz
}Örnek çözüm
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
f := t.Field(0)
fmt.Println(f.Tag.____("json"))
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ı |