Da trilha de Go Este conceito ainda não saiu como card do dia. ir para o card de hoje

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 T inclui métodos com receiver T; o de *T inclui T e *T.
  • Um valor T não pode chamar métodos com receiver *T se 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.
metodos_receivers.go
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())
}

Exercícios

  1. 1
    Fácil

    Método que dobra um número

    Crie um tipo Numero com um campo valor int e um método Dobro() que retorna o dobro do valor. Use receiver de valor.

    Resolver
  2. 2
    Médio

    Contador com incremento e reset

    Implemente um tipo Contador com campo n int. Adicione métodos Incrementar() e Reset() que modificam o contador, e Valor() int que retorna o valor atual. Use receiver de ponteiro para modificar e receiver de valor para ler.

    Resolver
  3. 3
    Desafio

    Formas geométricas com interface

    Crie uma interface Forma com o método Area() float64. Implemente os tipos Retangulo (campos largura, altura float64) e Circulo (campo raio float64). Use receiver de valor para Area. No main, crie um slice de Forma com um retângulo e um círculo, e imprima a área de cada um.

    Resolver

Continue estudando