Methods
Um method é uma function com um receiver — um parâmetro extra antes do nome da function que o liga a um tipo específico. func (r Rectangle) Area() se lê como uma function normal, mas r.Area() pode ser chamado diretamente em qualquer valor de Rectangle.
package main
import "fmt"
type Rectangle struct {
Width, Height float64
}
func (r Rectangle) Area() float64 {
return r.Width * r.Height
}
func main() {
rect := Rectangle{Width: 10, Height: 5}
fmt.Println("Area:", rect.Area())
}Area: 50
Pointer receivers para mutação
Um value receiver, como o de cima, recebe uma cópia do struct — mudanças dentro do method não afetam o original. Um pointer receiver, func (c *Counter), opera sobre o valor original de verdade, e é assim que um method consegue de fato modificar o estado do seu receiver.
package main
import "fmt"
type Counter struct {
Value int
}
func (c *Counter) Increment() {
c.Value++
}
func main() {
counter := Counter{Value: 0}
counter.Increment()
counter.Increment()
fmt.Println(counter.Value)
}2
A seguir: interfaces — a forma implícita e duck-typed do Go de descrever comportamento compartilhado.
Practice exercise
Defina um struct Circle com o campo Radius float64. Adicione um method Area() float64 que retorne 3.14159 * c.Radius * c.Radius. Crie um Circle com Radius 2, depois imprima circle.Area().