irfo
Moderatör
- Katılım
- 7 Ocak 2026
- Mesajlar
- 290
- Tepkime puanı
- 2
- Puanları
- 18
Derleyicinin Arkasından İş Çevirmek
Go statik tipli bir dildir. Yani değişkenin int mi string mi olduğu kod yazılırken bellidir. Ancak bazen öyle kodlar yazmanız gerekir ki (örneğin json.Marshal veya GORM gibi), fonksiyonunuza ne geleceğini bilemezsiniz. Bir Struct mı? Bir Map mi? Yoksa bir Pointer mı?İşte Reflection (Yansıma), program çalışırken (runtime) değişkenlerin tipini, alanlarını ve değerlerini inceleme ve değiştirme sanatıdır.
reflect
Reflection, interface{} tipindeki değişkenlerin içini açar. İki temel kavram vardır:- reflect.Type: Değişkenin türü nedir? (int, User struct, *string...)
- reflect.Value: Değişkenin o anki değeri nedir? (5, "Ahmet"...)
Kod:
package main
import ("fmt""reflect")
type Urun struct {Ad stringFiyat int}
// Bilinmeyen bir tipi inceleyen fonksiyonfunc İncele(q interface{}) {t := reflect.TypeOf(q)v := reflect.ValueOf(q)
fmt.Println("Tip:", t)<br>fmt.Println("Değer:", v)<br><br>// Eğer bu bir Struct ise alanlarını (fields) gezebiliriz<br>if t.Kind() == reflect.Struct {<br> fmt.Println("--- Struct Alanları ---")<br> for i := 0; i < t.NumField(); i++ {<br> field := t.Field(i) // Alanın tanımı (Adı, Tipi)<br> value := v.Field(i) // Alanın değeri<br> fmt.Printf("%s (%s) = %v\n", field.Name, field.Type, value)<br> }<br>}<br>
}
func main() {u := Urun{Ad: "Bilgisayar", Fiyat: 15000}İncele(u)}
Ne Zaman Kullanılmalı? (Ve Kullanılmamalı!)
- Kullanın: Genel amaçlı kütüphaneler yazarken (ORM, Serializer, Validasyon kütüphaneleri).
- Kullanmayın: Normal iş mantığında. Reflection yavaştır, karmaşıktır ve "Tip Güvenliğini" (Type Safety) devre dışı bırakır. Eğer Generics işinizi görüyorsa, Reflection'dan kaçın.