Struct field reflect
- Go kursu
- İleri seviye
- Ders 4/68
- 4 dk
Struct alanlarına reflect ile erişmeyi öğrenirsin.
Struct alanlarını gezmek
Bir struct türünün alan sayısını NumField() verir; her alana Field(i) ile ulaşırsın. Türden alan adını, değerden alanın içeriğini okursun.
k := Kitap{Ad: "Dune", Sayfa: 412}
t, v := reflect.TypeOf(k), reflect.ValueOf(k)
for i := 0; i < t.NumField(); i++ {
fmt.Println(t.Field(i).Name, v.Field(i))
}Çıktı: Ad Dune ve Sayfa 412.
Struct etiketleri ve dışa aktarma
t.Field(i).Tag.Get("json") alanın etiketini okur; JSON paketi alan adlarını böyle bulur. Küçük harfle başlayan (dışa aktarılmamış) alanların değeri okunabilir ama Interface() ile dışarı alınamaz ve değiştirilemez.
type K struct {
Ad string `json:"ad"`
}
f, _ := reflect.TypeOf(K{}).FieldByName("Ad")
fmt.Println(f.Tag.Get("json")) // adUygulama Alanları listele
type Student struct { Ad string; Not int } tanımla. Student{"Ece", 90} için tüm alanları NumField döngüsüyle gez ve her satırda alan adını ve 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 Student struct {
Ad string
Not int
}
func main() {
o := Student{"Ece", 90}
t, v := reflect.TypeOf(o), reflect.ValueOf(o)
for i := 0; i < t.NumField(); i++ {
fmt.Println(t.Field(i).Name, v.Field(i))
}
}Beklenen çıktı
Ad Ece Not 90
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 Alanın <strong>adını</strong> nereden okursun?
- NumField() sonucundan
- fmt.Sprint ile
- reflect.Type üzerindeki Field(i).Name Doğru cevap
- reflect.Value üzerindeki Field(i).Int()
Açıklama: Alan adı, etiketi ve türü gibi bilgiler türe aittir (StructField); değer tarafı yalnızca içeriği taşır.
2 Alan sayısı
for i := 0; i < t.____(); i++ {
for i := 0; i < t.NumField(); i++ {
Açıklama: NumField() struct türündeki alan sayısını verir.
3 Struct reflect parçaları
| Kavram | Anlamı |
|---|---|
NumField() |
Alan sayısı |
Field(i).Name |
Alan adı |
Tag.Get("json") |
Etiket değeri |
FieldByName |
Ada göre alan bulur |