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) }
(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:
type MyInt int) yöntem eklenebilir.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ı
[]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
Hikaye
Hikaye
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.