ProgramlamaBackend geliştirici

Go'da kullanıcı tanımlı türler ve takma adlar (type alias) nasıl çalışır ve yeni bir tür oluşturma ile takma ad arasında ne fark vardır? Hangi yaklaşım ne zaman tercih edilir?

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

Cevap.

Go dilinde geliştirici mevcut türler üzerinde kendi türlerini oluşturabilir veya kodun okunabilirliği ve dış kütüphanelerle entegrasyon için takma adlar ilan edebilir.

Meselenin geçmişi:

Go, tür sistemini basit hale getirerek yeni tür oluşturmaya (type MyInt int) ve takma ad oluşturmaya (type MyIntAlias = int) dair kavramları ayırır. Aralarında sıkça karışıklık yaşanır, bu da sistemin farklı parçaları arasında veri uyumluluğunu etkiler.

Sorun:

Yanlış tür ilan yönteminin seçilmesi, paketler arasında veri iletiminde sorunlar, dış kütüphanelerle yanlış çalışma veya takma adın kullanımı sırasında tüm yöntemlerin kaybolması gibi birçok örtük hataya neden olabilir.

Çözüm:

  • Yeni tür (type Foo T) gerçekten yeni bir tür yaratır ve kendi kimliğini taşır, mevcut bir türden (örneğin, int, struct) yola çıksa bile.
  • Takma tür (type Foo = T) mevcut bir tür için alternatif bir isim sağlar ve tüm yöntemlerini ve davranışını, arayüz uyumlulukları da dahil olmak üzere, tamamen korur.

Kod örneği:

package main import "fmt" type MyInt int // yeni tür func (m MyInt) Double() int { return int(m) * 2 } type MyIntAlias = int // takma tür func main() { var a MyInt = 5 var b MyIntAlias = 10 fmt.Println(a.Double()) // çalışıyor //fmt.Println(b.Double()) // hata: method belirlenmemiş int üzerinde }

Ana özellikler:

  • Yeni tür, temel türünden tamamen ayrıdır
  • Takma ad yeni bir tür oluşturmaz, sadece yeni bir isimdir
  • Yeni tür için tanımlanan yöntemler takma ad için geçerli değildir

Yanıltıcı sorular.

Bir yapının takma adını oluşturup ona, temel yapıdan farklı yöntemler ekleyebilir miyiz?

Hayır. Yöntemler yalnızca yeni türler için tanımlanabilir, takma adlar için değil. Takma ad, aynı tür için başka bir isimdir ve programın bir kısmı türün "genişlemesi" hakkında hiçbir şey bilmez.

type MyStructAlias = SomeStruct // func (s MyStructAlias) NewMethod() {} // Hata

Temel türün yöntemleri takma ada otomatik olarak "yapışabilir" mi?

Evet, çünkü derleyici için aynı türdür. Ancak yeni yöntemlerle çalışmak mümkün değildir: takma ada benzersiz yöntemler ekleyemezsiniz.

type MyString = string // string için tüm yöntemler ve fonksiyonlar çalışır

Tür dönüşümü ile takma ad dönüşümü arasındaki fark nedir?

Yeni tür ilan ederken açık bir dönüşüm gereklidir: MyInt(x) burada x — int. Takma ada dönüşüm gerekmez — türler tamamen yer değiştirilebilir.

type A int type B = int var x int = 3 var a A = A(x) // açık dönüşüm var b B = x // örtük, int ile aynı

Tür hataları ve anti-paternler

  • Yeni türler ve takma adların karışımıyla kod yapısının karmaşıklaştırılması
  • Takma adın yöntemlerinin beklenmedik şekilde yokluğu
  • Verileri izole etmek için takma adların kullanılması — bunu yapmak için uygun değildir (yeni türler tercih edilir)

Hayattan bir örnek

Olumsuz durum

Geliştirici, kendi yöntemlerini ekleyebileceğini düşünerek bir dış kütüphane için takma ad türü oluşturur ve geçiş mantığını kapsüller.

Artıları:

  • Dış API ile kolay entegrasyon

Eksileri:

  • Yöntemler eklenemez, davranış genişletilemez, veri mantığında öngörülemeyen bir durum ortaya çıkar

Olumlu durum

Ekip, kullanıcı tanımlayıcılarını temsil etmek için int temelli yeni bir tür oluşturur ve iş mantığını diğer tamsayı değerleri ile karıştırmamak için özel yöntemler (doğrulayıcılar, dönüştürücüler) ekler.

Artıları:

  • Sert tipleme, kullanım üzerinde kontrol
  • Meta yöntemleri desteklemesi kolay

Eksileri:

  • Temel ve yeni tür arasında açık dönüşümler yazmak zorunda kalınır