CodeBlanks Logo Icon CodeBlanks

reflect.Value

Value ile çalışma zamanı değerini öğrenirsin.

reflect.Value

reflect.ValueOf(v) değerin kendisini sarar. Çeşide uygun yöntemle içeriği okursun: Int(), String(), Float().

v := reflect.ValueOf(7)
fmt.Println(v.Int() * 2)  // 14

Yanlış yöntemi çağırmak (ör. string için Int()) panic üretir; önce v.Kind() ile kontrol etmek güvenlidir.

Değeri değiştirmek: Elem ve Set

Bir değeri reflect ile değiştirmek için ona işaretçi vermelisin; aksi halde kopya üzerinde çalışırsın ve Set panic üretir.

x := 1
v := reflect.ValueOf(&x).Elem()
v.SetInt(10)
fmt.Println(x)  // 10

Elem() işaretçinin gösterdiği değere geçer; CanSet() değiştirilebilir olup olmadığını söyler.

Uygulama Reflect ile değiştir

puan := 3 tanımla. reflect.ValueOf(&puan).Elem() ile değere eriş, SetInt(30) çağır ve puan'ı 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"
)

func main() {
    puan := 3
    v := reflect.ValueOf(&puan).Elem()
    v.SetInt(30)
    fmt.Println(puan)
}

Beklenen çıktı

30

Soru ve cevaplar

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

1 <code>reflect.ValueOf("Go").Int()</code> çalışınca ne olur?

  • 0 döner
  • "Go" döner
  • Derleme hatası verir
  • panic oluşur Doğru cevap

Açıklama: Int() yalnızca tamsayı çeşitlerinde çalışır; string için çağrılınca çalışma anında panic olur. Derleyici bunu yakalayamaz.

2 İşaretçiden değere geç

Soru
n := 5
v := reflect.ValueOf(&n).____()
v.SetInt(8)
Cevap
n := 5
v := reflect.ValueOf(&n).Elem()
v.SetInt(8)

Açıklama: Elem() işaretçinin gösterdiği değeri verir; ancak onun üzerinde SetInt çağrılabilir.

3 Value yöntemleri

Kavram Anlamı
Int() Tamsayı okur
SetInt() Tamsayı yazar
Elem() İşaretçinin hedefine geçer
CanSet() Değiştirilebilir mi?

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