In Go zijn methoden functies met een receiver die aangeeft tot welk type de methode behoort:
type User struct { Name string } func (u *User) SayHello() { fmt.Println("Hallo,", u.Name) }
(u *User)) werkt als het eerste argument in de functie, maar de syntaxis en aanroepingen zijn anders.Belangrijk! Methoden kunnen alleen worden gedeclareerd voor types die in jouw pakket zijn gedefinieerd (geen methoden voor types gedefinieerd in een ander pakket, incl. ingebouwde types). Het gedrag met aliassen (type alias) is bijzonder:
type MyInt int) kunnen methoden worden toegevoegd.type MyInt = int) kunnen geen methoden worden toegevoegd omdat dit alleen een alias is.Voorbeeld:
type MyInt int func (m MyInt) Double() int { return int(m) * 2 } // Type alias type MyIntAlias = int // func (m MyIntAlias) Double() int { ... } // compilatiefout
Kan je een methode declareren voor een slice van type []int of voor type alias?
Antwoord: Voor een slice van een ingebouwd type ([]int) kunnen geen methoden worden gedeclareerd. Voor een nieuwe gebruikersgedefinieerde type op basis van een slice — dat kan:
type MySlice []int func (s MySlice) Sum() int { ... } // toegestaan
Voor type alias is het niet mogelijk:
type SuperSlice = []int // func (s SuperSlice) Sum() int { ... } // fout
Geschiedenis
Geschiedenis
Geschiedenis
Bij het proberen van methoden toe te voegen aan types uit een externe package (bijvoorbeeld, time.Time) voor het standaardiseren van de werking met datums bleek dat dit niet mogelijk was in Go — ze moesten samenstelling en utility-functies gebruiken.