W Go metody to funkcje z receiver (odbiornikiem), który wskazuje, do jakiego typu odnosi się metoda:
type User struct { Name string } func (u *User) SayHello() { fmt.Println("Cześć,", u.Name) }
(u *User)) działa jak pierwszy argument w funkcji, ale składnia i wywołania różnią się.Ważne! Można deklarować metody tylko dla typów zdefiniowanych w Twoim pakiecie (brak metod na typach zdefiniowanych w innym pakiecie, w tym typach wbudowanych). Zachowanie z aliasami (type alias) jest szczególne:
type MyInt int) — można dodawać metody.type MyInt = int) — nie można dodawać metod, ponieważ to tylko pseudonim.Przykład:
type MyInt int func (m MyInt) Double() int { return int(m) * 2 } // Alias typu type MyIntAlias = int // func (m MyIntAlias) Double() int { ... } // błąd kompilacji
Czy można zadeklarować metodę dla slice typu []int lub dla aliasu typu?
Odpowiedź: Dla slice typu wbudowanego ([]int) nie można deklarować metod. Dla nowego typu użytkownika opartego na slice — można:
type MySlice []int func (s MySlice) Sum() int { ... } // dozwolone
Dla aliasu typu nie można:
type SuperSlice = []int // func (s SuperSlice) Sum() int { ... } // błąd
Historia
Historia
Historia
Przy próbie dodania metod do typów z zewnętrznego pakietu (np. time.Time) w celu ustandaryzowania pracy z datami okazało się, że to niemożliwe w Go — trzeba było używać kompozycji i funkcji pomocniczych.