Reflection Paketi: Meta-Programlamaya Giriş
Reflection, programın çalışırken kendi kodunu incelemesi ve değiştirmesidir. Go dilinde `reflect` paketi sayesinde bir değişkenin tipini, değerini öğrenebilir ve hatta dinamik olarak değiştirebilirsin.
Bu, sert tipli Go dilinde esnek kod yazmanı sağlar. Örneğin, fonksiyonun kaç parametre aldığını runtime'da öğrenebilirsin.
Reflection iki ana kavrama dayanır:
- Type: Değişkenin veri tipi (int, string, struct vb.)
- Value: Değişkenin gerçek değeri
Bir değişkeni incelemek için önce `reflect.TypeOf()` ve `reflect.ValueOf()` kullanırsın.
1package main23import (4"fmt"5"reflect"6)78func main() {9x:= 4210s:= "merhaba"11arr:= []int{1, 2, 3}1213fmt.Println("x tipi:", reflect.TypeOf(x))14fmt.Println("x değeri:", reflect.ValueOf(x))1516fmt.Println("s tipi:", reflect.TypeOf(s))17fmt.Println("s değeri:", reflect.ValueOf(s))1819fmt.Println("arr tipi:", reflect.TypeOf(arr))20fmt.Println("arr uzunluğu:", reflect.ValueOf(arr).Len())21}Çıktı:
1x tipi: int2x değeri: 423s tipi: string4s değeri: merhaba5arr tipi: []int6arr uzunluğu: 3Reflection ile bir değişkenin değerini runtime'da değiştirebilirsin. Ancak değişken pointer olmalıdır.
1package main23import (4"fmt"5"reflect"6)78func main() {9x:= 1010ptr:= &x1112val:= reflect.ValueOf(ptr).Elem()13fmt.Println("Eski değer:", val.Int())1415val.SetInt(99)16fmt.Println("Yeni değer:", x)17}Çıktı:
1Eski değer: 102Yeni değer: 99Bir struct'ın alanlarını ve etiketlerini dinamik olarak okuyabilirsin.
1package main23import (4"fmt"5"reflect"6)78type Kisi struct {9Ad string `json:"ad"`10Yas int `json:"yas"`11}1213func main() {14k:= Kisi{"Ali", 25}15t:= reflect.TypeOf(k)1617for i:= 0; i < t.NumField(); i++ {18field:= t.Field(i)19fmt.Printf("Alan: %s, Tip: %v, Tag: %s\n",20field.Name, field.Type, field.Tag.Get("json"))21}22}Çıktı:
1Alan: Ad, Tip: string, Tag: ad2Alan: Yas, Tip: int, Tag: yasReflection JSON parsing, ORM kütüphaneleri (database/sql), test framework'leri ve dependency injection sistemlerinde kullanılır.
Ancak dikkat et: Reflection yavaştır. Performans kritikse sınırlı kullan.
bknz: Backend'de Özel Hata Sınıfları: Standart Exceptions'tan Neden Uzaklaşmalı
0 yorum