Methods
#
// Go suporta _métodos_ definidos em structs.
package main
import "fmt"
type rect struct {
width, height int
}
// O método `area` tem um _receiver type_ de `*rect`.
func (r *rect) area() int {
return r.width * r.height
}
// Métodos podem ser definidos tanto com _receiver types_ que são
// ponteiros ou valores. Aqui está um exemplo de receiver de valor.
func (r rect) perimetro() int {
return 2*r.width + 2*r.height
}
func main() {
r := rect{width: 10, height: 5}
// Aqui são chamados dois métodos definidos para a struct.
fmt.Println("area: ", r.area())
fmt.Println("perimetro:", r.perimetro())
// Go faz automaticamente conversões entre valores e
// ponteiros para chamadas de métodos. Geralmente se
// usa um _pointer receiver_ para se evitar a necessidade
// de passar uma cópia da struct como parâmetro da função
// ou para permitir que o método altere a struct.
rp := &r
fmt.Println("area: ", rp.area())
fmt.Println("perimetro:", rp.perimetro())
}
$ go run methods.go
area: 50
perim: 30
area: 50
perim: 30
# Em seguida, será apresentado o mecanismo de Go para
# agroupar e nomear conjuntos de métodos: interfaces.