CodeBlanks Logo Icon CodeBlanks

Struct field reflect

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"))  // ad

Uygulama 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

main.go
package main

import (
    "fmt"
    "reflect"
)

func main() {
    // buraya yaz
}

Örnek çözüm

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

Soru
for i := 0; i < t.____(); i++ {
Cevap
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

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