Go Tipos Intermediário
Métodos e receivers
Em Go, um método é uma função associada a um tipo, chamada de receiver. O receiver pode ser um valor (func (c Contador) Inc()) ou um ponteiro (func (c *Contador) Inc()). A escolha afeta se o método pode modificar o valor original e quais interfaces o tipo satisfaz.
O method set de um tipo define quais métodos estão disponíveis para valores e ponteiros. Um tipo T tem métodos com receiver T e *T; um ponteiro *T tem acesso a ambos. Isso importa ao atribuir a interfaces: um valor T só satisfaz uma interface se ela exigir apenas métodos com receiver T.
Métodos em tipos próprios permitem criar abstrações claras e reutilizáveis. Use receiver de valor para tipos pequenos e imutáveis; use ponteiro quando precisar modificar o receptor ou evitar cópias grandes.
Pontos-chave
- Receiver de valor copia o receptor; receiver de ponteiro acessa o original.
- O method set de
Tinclui métodos com receiverT; o de*TincluiTe*T. - Um valor
Tnão pode chamar métodos com receiver*Tse não for endereçável. - Interfaces são satisfeitas conforme o method set do tipo concreto.
- Prefira receiver de ponteiro para modificar estado ou evitar cópias.
package main
import "fmt"
type Contador struct {
n int
}
// Receiver de valor: opera sobre uma cópia, não modifica o original.
func (c Contador) Valor() int {
return c.n
}
// Receiver de ponteiro: modifica o valor original.
func (c *Contador) Incrementar() {
c.n++
}
// Receiver de ponteiro para evitar cópia de struct grande.
func (c *Contador) Reset() {
c.n = 0
}
func main() {
c := Contador{n: 10}
c.Incrementar() // Go converte automaticamente (&c).Incrementar()
fmt.Println("após incremento:", c.Valor())
c.Reset()
fmt.Println("após reset:", c.Valor())
// Método com receiver de valor em um valor não endereçável.
fmt.Println("valor temporário:", Contador{n: 99}.Valor())
}