ProgrammatieGo ontwikkelaar

Hoe werken methoden voor structuren in Go? Wat is het verschil tussen het declareren van een methode en een functie, en hoe zijn methoden geïmplementeerd voor types op basis van aliassen (type alias)?

Slaag voor sollicitatiegesprekken met de Hintsage AI-assistent

Antwoord

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) }
  • Een methode is gekoppeld aan een specifiek type (bijvoorbeeld, User), terwijl een functie dat niet is.
  • De receiver van de methode ((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:

  • Voor nieuwe types op basis van bestaande (type MyInt int) kunnen methoden worden toegevoegd.
  • Voor type aliassen (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

Vraag met een valstrik

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

Voorbeelden van echte fouten door onwetendheid over de details van het onderwerp


Geschiedenis

In een microservices-project definieerde het team een type alias voor int64 (voor ID's) en probeerden ze methoden voor validatie direct voor hem te declareren — de code compileerde niet, en het team moest alle structuren refactoren om methoden te ondersteunen.

Geschiedenis

In een backend-project schreven ze methoden voor een aangepaste slice, maar ze definieerden per ongeluk geen nieuw type (type ... []T), maar werkten met de ingebouwde []T, waardoor ze geen enkele methode konden toevoegen voor het werken met de elementen van de slice.

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.