Menu
Coddy logo textTech

Recebedores de Ponteiro vs Valor

Parte da seção Programação Orientada a Objetos do Journey de GO da Coddy — lição 8 de 107.

Métodos podem ter um receptor de valor ou um receptor de ponteiro. Um receptor de valor trabalha em uma cópia da struct. Um receptor de ponteiro trabalha na struct original e pode modificar seus campos.

Receptor de valor — funciona em uma cópia

type Counter struct {
    Count int
}

func (c Counter) GetCount() int {
    return c.Count
}

// Isso NÃO modifica o original
func (c Counter) IncrementWrong() {
    c.Count++ // Altera apenas a cópia!
}

Receiver de ponteiro — modifica o original

// Isso MODIFICA o original
func (c *Counter) Increment() {
    c.Count++
}

func (c *Counter) Reset() {
    c.Count = 0
}

Usando ambos juntos

func main() {
    counter := Counter{Count: 0}

    counter.Increment()
    counter.Increment()
    fmt.Println(counter.GetCount()) // Saída: 2

    counter.Reset()
    fmt.Println(counter.GetCount()) // Saída: 0
}

Use um receptor de valor quando o método apenas lê dados. Use um receptor de ponteiro (*StructName) quando o método precisa modificar os campos da struct. O Go lida automaticamente com a referência — você chama ambos da mesma forma.

challenge icon

Desafio

Médio

Adicione métodos à struct Wallet usando os tipos de receptor corretos:

  • GetBalance — receptor de valor, retorna o saldo atual
  • Deposit — receptor de ponteiro, adiciona o valor ao saldo
  • Withdraw — receptor de ponteiro, subtrai o valor apenas se houver fundos suficientes

Folha de consulta

Métodos podem ter um receptor de valor ou um receptor de ponteiro. Um receptor de valor trabalha em uma cópia da struct. Um receptor de ponteiro trabalha na struct original e pode modificar seus campos.

Receptor de valor — trabalha em uma cópia:

type Counter struct {
    Count int
}

func (c Counter) GetCount() int {
    return c.Count
}

Receptor de ponteiro — modifica o original:

func (c *Counter) Increment() {
    c.Count++
}

Use um receptor de valor quando o método apenas lê dados. Use um receptor de ponteiro (*StructName) quando o método precisar modificar os campos da struct.

Experimente você mesmo

package main

import "fmt"

func main() {
    var balance, deposit, withdraw float64
    fmt.Scan(&balance, &deposit, &withdraw)

    w := Wallet{Balance: balance}

    fmt.Printf("Balance: %.2f\n", w.GetBalance())

    w.Deposit(deposit)
    fmt.Printf("After deposit: %.2f\n", w.GetBalance())

    w.Withdraw(withdraw)
    fmt.Printf("After withdrawal: %.2f\n", w.GetBalance())

    fmt.Printf("Final balance: %.2f\n", w.GetBalance())
}
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Programação Orientada a Objetos