ProgramlamaGo Geliştirici

Go'da yapıların yöntemleri nasıl çalışır? Yöntem bildiriminin işlevden farkı nedir ve alias (type alias) temelinde türler için yöntemler nasıl uygulanır?

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

Cevap

Go'da yöntemler, hangi türün yöntemine karşılık geldiğini belirten bir receiver (alıcı) ile birlikte gelen işlevlerdir:

type User struct { Name string } func (u *User) SayHello() { fmt.Println("Merhaba,", u.Name) }
  • Yöntem belirli bir türle (örneğin, User) ilişkilidir, oysa işlev ilişkin değildir.
  • Yöntem alıcısı ((u *User)) işlevdeki ilk argüman gibi çalışır, ancak sözdizimi ve çağrılar farklıdır.

Önemli! Yöntemler yalnızca paketinizde tanımlanmış türler için bildirilebilir (diğer paketlerde tanımlanmış türlerde, dahil olmak üzere yerleşik türlerde yöntem yok). Aliaslar (type alias) ile davranış özel bir durumdur:

  • Mevcut olanlardan yeni türler için (type MyInt int) yöntem eklenebilir.
  • Type alias için (type MyInt = int) yöntem eklenemez, çünkü bu sadece bir takma isimdir.

Örnek:

type MyInt int func (m MyInt) Double() int { return int(m) * 2 } // Type alias type MyIntAlias = int // func (m MyIntAlias) Double() int { ... } // derleme hatası

Kandırıcı Soru

[]int türünde bir dilim için veya type alias için bir yöntem bildirmek mümkün mü?

Cevap: Yerleşik tür olan dilim ([]int) için yöntem bildirmek mümkün değildir. Bir dilimin üzerine kurulmuş yeni bir kullanıcı türü için - mümkündür:

type MySlice []int func (s MySlice) Sum() int { ... } // geçerli

Type alias için mümkün değildir:

type SuperSlice = []int // func (s SuperSlice) Sum() int { ... } // hata

Konuyla ilgili ince ayrıntılardan kaynaklanan gerçek hata örnekleri


Hikaye

Mikro hizmetler projesinde takım, int64 (Tanımlayıcılar için) için bir type alias tanımladı ve doğrudan ona doğrulama yöntemleri bildirmeye çalıştı - kod derlenmedi, yöntemleri desteklemek için tüm yapıların yeniden düzenlenmesi gerekti.

Hikaye

Backend projesinde özel bir dilim için yöntemler yazdık, ancak yanlışlıkla yeni bir tür (type ... []T) tanımlamadık ve yerleşik []T ile çalıştık, bu nedenle dilim elemanları ile çalışmak için hiçbir yöntem ekleyemedik.

Hikaye

Dış paketlerden türler (örneğin, time.Time) için yöntemler eklemeye çalışırken, tarihlerle ilgili standart çalışma sağlamak için bunun Go'da mümkün olmadığı anlaşıldı - bileşim ve yardımcı işlevler kullanmak zorunda kaldık.