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

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