Médio Go

Atualizar campo de struct via ponteiro

Enunciado

Crie uma struct Conta com os campos Titular string e Saldo float64. Escreva um método Depositar(valor float64) com receptor ponteiro que soma valor ao saldo. No main, crie uma conta, deposite 100.50 e imprima o saldo formatado com duas casas decimais.

Requisitos

  • A struct Conta deve ter os campos Titular e Saldo.
  • O método Depositar deve ter receptor (c *Conta).
  • O método deve somar o valor ao campo Saldo.
  • A saída deve mostrar o saldo com duas casas decimais usando fmt.Printf.

Código inicial

package main

import "fmt"

type Conta struct {
	Titular string
	Saldo   float64
}

// Depositar adiciona valor ao saldo da conta.
func (c *Conta) Depositar(valor float64) {
	// complete aqui
}

func main() {
	c := Conta{Titular: "Maria", Saldo: 50.0}
	c.Depositar(100.50)
	fmt.Printf("Saldo: %.2f\n", c.Saldo)
}

Saída esperada

Saldo: 150.50
Ver dica

No método, use c.Saldo += valor. O receptor *Conta permite modificar a struct original.

Mostrar solução
package main

import "fmt"

type Conta struct {
	Titular string
	Saldo   float64
}

// Depositar adiciona valor ao saldo da conta usando receptor ponteiro.
func (c *Conta) Depositar(valor float64) {
	c.Saldo += valor // modifica o campo da struct original
}

func main() {
	c := Conta{Titular: "Maria", Saldo: 50.0}
	c.Depositar(100.50) // Go passa &c automaticamente para método com receptor ponteiro
	fmt.Printf("Saldo: %.2f\n", c.Saldo)
}

Passo a passo

  1. Definimos a struct Conta com Titular e Saldo.
  2. O método Depositar tem receptor (c *Conta), ou seja, opera sobre um ponteiro para Conta.
  3. Dentro do método, c.Saldo += valor é equivalente a (*c).Saldo += valor; Go faz a desreferenciação automática.
  4. No main, criamos c com saldo inicial 50.0.
  5. Chamamos c.Depositar(100.50). Como o método tem receptor ponteiro, Go automaticamente passa &c.
  6. O saldo de c é atualizado para 150.50.
  7. fmt.Printf("Saldo: %.2f\n", c.Saldo) imprime com duas casas decimais.

Por que funciona

Métodos com receptor ponteiro recebem o endereço da variável, então alterações nos campos afetam a struct original. Se o receptor fosse (c Conta) (valor), c seria uma cópia e o saldo original não mudaria. Go permite chamar métodos com receptor ponteiro em variáveis endereçáveis, passando o endereço implicitamente.

Erros comuns

  • Usar receptor valor: func (c Conta) Depositar(...) — o saldo original não é alterado.
  • Esquecer o & ao passar para função: se Depositar fosse uma função comum func Depositar(c *Conta, ...), seria necessário Depositar(&c, 100.50).
  • Tentar chamar método com receptor ponteiro em valor não endereçável, como Conta{}.Depositar(10): erro de compilação (cannot call pointer method on Conta literal).

Outra forma de resolver

Retornar uma nova Conta com saldo atualizado:

func (c Conta) ComDeposito(valor float64) Conta {
	c.Saldo += valor
	return c
}
// main: c = c.ComDeposito(100.50)

Útil quando se prefere imutabilidade ou quando a struct é pequena.

Saída esperada

Saldo: 150.50