Metode
O metodă reprezintă o funcție asociată unui tip specific. Metodele sunt definite la fel ca funcțiile obișnuite, cu excepția faptului că în definirea metodei trebuie să se specifice și receptorul sau receiver. Receptorul este parametrul tipului la care se atașează metoda:
func (numele_parametrului tip_receptor) nume_metoda (parametri) (tipuri_rezultate_returnate){
corp_metoda
}
Să presupunem că avem un tip denumit care reprezintă un slice de șiruri de caractere:
type library []string
Pentru a afișa toate elementele din slice, putem defini următoarea metodă:
func (l library) print(){
for _, val := range l{
fmt.Println(val)
}
}
Partea dintre cuvântul cheie func și numele metodei, care reprezintă definirea receptorului pentru care va fi definită această metodă: (l library). Folosind parametrul receptor (l în acest caz), putem accesa receptorul. De exemplu, în cazul nostru, receptorul reprezintă un slice - un set de obiecte. Folosind un ciclu for, putem parcurge acest slice și afișa toate elementele sale pe consolă.
Deoarece print reprezintă o metodă definită pentru tipul library, nu o funcție obișnuită, putem apela această metodă pentru orice obiect de tip library:
var lib library = library{ "Book1", "Book2", "Book3" }
lib.print()
lib este un obiect de tipul library, astfel încât pentru el putem apela metoda print. În acest caz, obiectul lib va fi valoarea care va fi transmisă funcției print prin parametrul (l library).
Metodele pentru structuri
În mod similar, putem defini metode și pentru structuri:
package main
import "fmt"
type person struct{
name string
age int
}
func (p person) print(){
fmt.Println("Nume:", p.name)
fmt.Println("Vârstă:", p.age)
}
func (p person) eat(meal string){
fmt.Println(p.name, "mănâncă", meal)
}
func main() {
var tom = person { name: "Tom", age: 24 }
tom.print()
tom.eat("borș cu varză, dar nu roșu")
}
Ieșirea în consolă a acestui program:
Nume: Tom
Vârstă: 24
Tom mănâncă borș cu varză, dar nu roșu
În acest caz, pentru structura person sunt definite două funcții: print și eat. Funcția print afișează informații despre obiectul person curent. Funcția eat simulează consumul de alimente. Fiecare dintre aceste funcții definește obiectul și tipul structurii la care funcția se aplică:
func (p person) nume_funcție
Folosind obiectul p, putem accesa proprietățile structurii person. În rest, acestea sunt funcții obișnuite care pot primi parametri și returna rezultate.
Pentru a apela funcțiile structurii, se specifică variabila structurii, iar prin punct se face apelul funcției:
tom.print()
tom.eat("borș")
În acest caz, tom va reprezenta obiectul p person din definiția funcției.