reflect.Value
- Go kursu
- İleri seviye
- Ders 3/68
- 4 dk
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) // 14Yanlış 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) // 10Elem() 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
package main
import (
"fmt"
"reflect"
)
func main() {
// buraya yaz
}Örnek çözüm
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ç
n := 5
v := reflect.ValueOf(&n).____()
v.SetInt(8)
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? |