Go por Exemplo: Métodos

Go suporta métodos definidos em tipos struct.

package main
import "fmt"
type rect struct {
    width, height int
}

Este método area possui um tipo receptor de *rect.

func (r *rect) area() int {
    return r.width * r.height
}

Métodos podem ser definidos para qualquer tipo de receptor ponteiro ou valor. Aqui temos um exemplo de receptor de valor.

func (r rect) perim() int {
    return 2*r.width + 2*r.height
}
func main() {
    r := rect{width: 10, height: 5}

Nós podemos chamar 2 métodos definidos na nossa estrutura.

    fmt.Println("area: ", r.area())
    fmt.Println("perim:", r.perim())

Go trata automaticamente conversões entre valores e ponteiros para métodos de chamada. Você pode querer usar um ponteiro do tipo receptor para evitar a cópia de um método de chamada ou para permitir que o método faça mutação da estrutura recebida.

    rp := &r
    fmt.Println("area: ", rp.area())
    fmt.Println("perim:", rp.perim())
}
$ go run métodos.go
area:  50
perim: 30
area:  50
perim: 30

Em seguida vamos olhar os mecanismos do Go para agrupar e nomear conjuntos relacionados de métodos: interfaces.

Próximo exemplo: Interfaces.