AnyCompiler

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())
}
Output
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)
}
Output
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().