Um método é uma função com um argumento recetor especial.
O recetor aparece na sua própria lista de argumentos, entre a palavra-chave func e o nome do método.
func (receiver type) MethodName(parameters) (returnTypes) {
}
Só podes definir um método com um recetor cujo tipo esteja definido no mesmo pacote do método.
type Person struct {
Name string
}
func (p Person) Greetings() string {
return fmt.Sprintf("Welcome %s!", p.Name)
}
s := Person{Name: "Bronson"}
fmt.Println(s.Greetings())
// Output: Welcome Bronson!
Há dois tipos de recetores: recetores de valor e recetores de ponteiro.
Os métodos com recetor de valor operam sobre uma cópia do valor que lhes é passado, o que significa que qualquer alteração feita ao recetor dentro do método não é visível para quem chama.
Podes declarar métodos com recetores de ponteiro para modificar o valor para o qual o recetor aponta. Essas modificações também são visíveis para quem chama o método.
type rect struct {
width, height int
}
func (r *rect) squareIt() {
r.height = r.width
}
r := rect{width: 10, height: 20}
fmt.Printf("Width: %d, Height: %d\n", r.width, r.height)
// Output: Width: 10, Height: 20
r.squareIt()
fmt.Printf("Width: %d, Height: %d\n", r.width, r.height)
// Output: Width: 10, Height: 10
Podes encontrar vários exemplos aqui. Vê também este pequeno tutorial sobre métodos.
Lembra-te: um método é apenas uma função com um argumento recetor.