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 main
2
3import (
4"fmt"
5"reflect"
6)
7
8func main() {
9x:= 42
10s:= "merhaba"
11arr:= []int{1, 2, 3}
12
13fmt.Println("x tipi:", reflect.TypeOf(x))
14fmt.Println("x değeri:", reflect.ValueOf(x))
15
16fmt.Println("s tipi:", reflect.TypeOf(s))
17fmt.Println("s değeri:", reflect.ValueOf(s))
18
19fmt.Println("arr tipi:", reflect.TypeOf(arr))
20fmt.Println("arr uzunluğu:", reflect.ValueOf(arr).Len())
21}

Çıktı:

1x tipi: int
2x değeri: 42
3s tipi: string
4s değeri: merhaba
5arr tipi: []int
6arr uzunluğu: 3

Reflection ile bir değişkenin değerini runtime'da değiştirebilirsin. Ancak değişken pointer olmalıdır.

Reklam · TEST
AdSense Test ReklamıYazı arası (gönderi içi) · Yazı arası
1package main
2
3import (
4"fmt"
5"reflect"
6)
7
8func main() {
9x:= 10
10ptr:= &x
11
12val:= reflect.ValueOf(ptr).Elem()
13fmt.Println("Eski değer:", val.Int())
14
15val.SetInt(99)
16fmt.Println("Yeni değer:", x)
17}

Çıktı:

1Eski değer: 10
2Yeni değer: 99

Bir struct'ın alanlarını ve etiketlerini dinamik olarak okuyabilirsin.

1package main
2
3import (
4"fmt"
5"reflect"
6)
7
8type Kisi struct {
9Ad string `json:"ad"`
10Yas int `json:"yas"`
11}
12
13func main() {
14k:= Kisi{"Ali", 25}
15t:= reflect.TypeOf(k)
16
17for 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: ad
2Alan: Yas, Tip: int, Tag: yas

Reflection 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ı

Reklam · TEST
AdSense Test ReklamıGönderi altı · Görüntülü
konu hakkında tepkinizi verebilirsiniz