Médio Go
Contador com incremento e reset
Enunciado
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.
Requisitos
Incrementar()eReset()devem usar receiver de ponteiroValor()deve usar receiver de valor- No
main, incrementar 3 vezes, imprimir, resetar e imprimir de novo
Código inicial
package main
import "fmt"
type Contador struct {
n int
}
// TODO: implemente Incrementar, Reset e Valor
func main() {
c := Contador{}
// TODO: use os métodos
}
Saída esperada
valor: 3
valor: 0
Ver dica
Para modificar o campo, o receiver precisa ser ponteiro: func (c *Contador) Incrementar(). Para ler, pode ser valor.
Mostrar solução
package main
import "fmt"
type Contador struct {
n int
}
// Receiver de ponteiro: modifica o campo n do original.
func (c *Contador) Incrementar() {
c.n++
}
// Receiver de ponteiro: zera o contador.
func (c *Contador) Reset() {
c.n = 0
}
// Receiver de valor: apenas lê o valor.
func (c Contador) Valor() int {
return c.n
}
func main() {
c := Contador{}
c.Incrementar()
c.Incrementar()
c.Incrementar()
fmt.Println("valor:", c.Valor())
c.Reset()
fmt.Println("valor:", c.Valor())
}
Passo a passo
- Definimos
Contadorcom um campon int. Incrementarusa receiver*Contadorpara alterarc.nno valor original.Resettambém usa ponteiro para atribuir0ao campo.Valorusa receiver de valor, pois só lê o campo.- No
main, chamamosIncrementartrês vezes; Go convertecpara&cautomaticamente. - Imprimimos
c.Valor()e depois chamamosReset()e imprimimos novamente.
Por que funciona
Métodos com receiver de ponteiro recebem o endereço do valor, então modificam o original. Como c é uma variável endereçável, c.Incrementar() é açúcar sintático para (&c).Incrementar(). O method set de *Contador inclui métodos de Contador e *Contador, permitindo chamar Valor também.
Erros comuns
- Usar receiver de valor em
Incrementar:func (c Contador) Incrementar() { c.n++ }incrementa apenas a cópia; o original permanece 0. - Esquecer de chamar
Resetantes da segunda impressão: a saída seriavalor: 3duas vezes. - Tentar chamar método de ponteiro em valor não endereçável:
Contador{}.Incrementar()gera erro de compilação.
Outra forma de resolver
Poderia usar um campo int diretamente e expor funções, mas métodos deixam a API mais clara e permitem implementar interfaces.
Saída esperada
valor: 3
valor: 0