ProgramlamaArka Uç Geliştirici

Go dilindeki tiplerin nasıl çalıştığını ve tip kontrolünü açıklayın. Hangi tür tip dönüşümleri vardır ve bunlar nasıl farklılık gösterir?

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap

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:

  1. Açık tip dönüşümü (Type Casting) – programcının açık bir şekilde gerekli tipi belirtmesidir.
  2. Assertion (tip doğrulama) – belirli bir alt türün kontrolü için arayüzlere uygulanır.
  • Açık tip dönüşüm örneği:
var i int = 42 var f float64 = float64(i)
  • Tip doğrulama örneğ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).

Cazip bir soru

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") }

Bu konu hakkında bilinçsizlikten kaynaklanan gerçek hata örnekleri


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ü.