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() e Reset() devem usar receiver de ponteiro
  • Valor() 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

  1. Definimos Contador com um campo n int.
  2. Incrementar usa receiver *Contador para alterar c.n no valor original.
  3. Reset também usa ponteiro para atribuir 0 ao campo.
  4. Valor usa receiver de valor, pois só lê o campo.
  5. No main, chamamos Incrementar três vezes; Go converte c para &c automaticamente.
  6. Imprimimos c.Valor() e depois chamamos Reset() 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 Reset antes da segunda impressão: a saída seria valor: 3 duas 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