Go dilinde statik ve katı tipleme uygulanmaktadır. Bu, her değişkenin tipinin derleme zamanında bilindiği ve derleyicinin uyumsuz tiplerle işlemler yapmasına izin vermediği anlamına gelir.
İki tür tip dönüşümü vardır:
var i int = 42 var f float64 = float64(i)
var i interface{} = "hello" s, ok := i.(string) if ok { fmt.Println("String değeri:", s) } else { fmt.Println("i bir string değil") }
Dönüşüm yalnızca uyumlu temel tipler arasında mümkündür (int → float64, rune → int32, ancak string → int yapılamaz).
interface{} nil değeri saklayabilir mi ve arayüz tipinde bir değişkenin gerçekten nil olduğunu nasıl doğru bir şekilde kontrol edebiliriz?
Yaygın tuzak — nil değeri içeren bir arayüzü doğrudan nil ile karşılaştırmaktır:
var err error = nil var i interface{} = err fmt.Println(i == nil) // true bekleniyor, ancak false çıkacak!
Doğru yol:
Hem arayüzün kendisinin nil olduğunu hem de yerleşik değerin nil olduğunu kontrol etmektir:
if i == nil || reflect.ValueOf(i).IsNil() { fmt.Println("i gerçekten nil") }
Hikaye
Arka uç projesinde bir geliştirici çeşitli hataları interface{} aracılığıyla işlemeye çalıştı, bunları nil ile karşılaştırdı. Sonuç olarak, hata düzgün bir şekilde tespit edilemedi — gizli hatalar ve müşteriye geri dönüşlerde yanlış mantık ortaya çıktı.
Hikaye
Float64 ile int arasında açık bir dönüşüm olmaksızın geçiş yapmak, sessiz veri kaybına neden oldu: değerler yuvarlandı veya hatalı bir şekilde iletildi, çünkü Go derleyicisi bu tür işlemler için açık bir dönüşüm talep eder.
Hikaye
Map[string]interface{} ile çalışırken arayüz değerlerinin serileştirilmesinde (örneğin, JSON'dan) beklenmedik numara türleri (float64) type assertion olmadan ekstra bir kontrol olmaksızın kullanıldığında paniğe neden oldu — hizmet, çalışma zamanı hatası nedeniyle çöktü.