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
Contadeve ter os camposTitulareSaldo. - O método
Depositardeve 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
- Definimos a struct
ContacomTitulareSaldo. - O método
Depositartem receptor(c *Conta), ou seja, opera sobre um ponteiro paraConta. - Dentro do método,
c.Saldo += valoré equivalente a(*c).Saldo += valor; Go faz a desreferenciação automática. - No
main, criamosccom saldo inicial 50.0. - Chamamos
c.Depositar(100.50). Como o método tem receptor ponteiro, Go automaticamente passa&c. - O saldo de
cé atualizado para 150.50. 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: seDepositarfosse uma função comumfunc Depositar(c *Conta, ...), seria necessárioDepositar(&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