Go'da interface{} ile Tür Dönüşüm Hataları Nasıl Çözülür?

# Go'da interface{} ile Tür Dönüşüm Hataları Nasıl Çözülür?

Go'da `interface{}` (boş interface) her türü kabul eder. Ama içindeki değeri kullanmak istediğinde tür bilgisi kaybolmuş olur. Yanlış dönüşüm denemesi programı çökertir. Bu yazıda güvenli yolları göreceğiz.

Bir fonksiyon `interface{}`'e bir değer koydu. Çıkardığında ne tür olduğunu nasıl bileceksin?

1package main
2
3import "fmt"
4
5func main() {
6var data interface{} = 42
7
8// Doğrudan kullanamıyorsun
9// result:= data + 10 // HATA: interface{} + int tanımsız
10
11fmt.Println(data)
12}

Değerin hangi tür olduğunu biliyorsan, doğrudan dönüştür:

1package main
2
3import "fmt"
4
5func main() {
6var data interface{} = 42
7
8// Tür iddiası
9num:= data.(int)
10fmt.Println(num + 10) // 52
11}

Çıktı: `52`

Reklam · TEST
AdSense Test ReklamıYazı arası (gönderi içi) · Yazı arası

Ama yanlış tür tahmin edersen program çöker. Güvenli yol:

1package main
2
3import "fmt"
4
5func main() {
6var data interface{} = "merhaba"
7
8// İkinci return değeri kontrolü
9num, ok:= data.(int)
10if ok {
11fmt.Println("Sayı:", num)
12} else {
13fmt.Println("Bu bir sayı değil")
14}
15}

Çıktı: `Bu bir sayı değil`

Birden fazla türü kontrol etmek istiyorsan:

1package main
2
3import "fmt"
4
5func İşle(data interface{}) {
6switch v:= data.(type) {
7case int:
8fmt.Println("Tamsayı:", v*2)
9case string:
10fmt.Println("Yazı:", v+"!")
11case float64:
12fmt.Println("Ondalık:", v/2)
13default:
14fmt.Println("Bilinmeyen tür")
15}
16}
17
18func main() {
19İşle(100)
20İşle("Go")
21İşle(3.14)
22}

Çıktı:

1Tamsayı: 200
2Yazı: Go!
3Ondalık: 1.57

JSON parse ettiğinde `interface{}`'e çıkan değerleri hep `ok` kontrolüyle dönüştür. Kullanıcı girdisi veya API cevaplarında tür güvenliğini asla ihmal etme. Böylece beklenmedik tür geldiğinde programın nasıl davranacağını kontrol edersin.

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