In Go, i metodi sono funzioni con un receiver (ricevente) che indica a quale tipo appartiene il metodo:
type User struct { Name string } func (u *User) SayHello() { fmt.Println("Ciao,", u.Name) }
(u *User)) funziona come il primo argomento in una funzione, ma la sintassi e le chiamate sono diverse.Importante! I metodi possono essere dichiarati solo per tipi definiti nel proprio pacchetto (no methods on type defined in other package, incl. built-in types). Il comportamento con gli alias (type alias) è speciale:
type MyInt int) — è possibile aggiungere metodi.type MyInt = int) — non è possibile aggiungere metodi, perché è solo un alias.Esempio:
type MyInt int func (m MyInt) Double() int { return int(m) * 2 } // Type alias type MyIntAlias = int // func (m MyIntAlias) Double() int { ... } // errore di compilazione
È possibile dichiarare un metodo per uno slice di tipo []int o per un type alias?
Risposta: Per uno slice di tipo built-in ([]int) non è possibile dichiarare metodi. Per un nuovo tipo personalizzato basato su uno slice — si può:
type MySlice []int func (s MySlice) Sum() int { ... } // consentito
Per un type alias non è possibile:
type SuperSlice = []int // func (s SuperSlice) Sum() int { ... } // errore
Storia
Storia
Storia
Cercando di aggiungere metodi ai tipi di un pacchetto esterno (ad esempio, time.Time) per standardizzare il lavoro con le date, si è scoperto che non è possibile in Go — è stato necessario utilizzare la composizione e funzioni utility.