Desafio Go

Zero values e escopo em uma função

Enunciado

Escreva uma função contador que declare uma variável total com zero value (var total int). Dentro de um laço for de 1 a 3, some o valor de i a total e imprima o total parcial. Após o laço, imprima o total final. No main, chame a função e também declare uma variável total com valor 100 para demonstrar que o escopo da função não afeta o main.

Requisitos

  • A função contador deve usar var total int (zero value).
  • O laço deve ir de 1 a 3 e somar i a total.
  • Imprimir o total parcial a cada iteração e o total final após o laço.
  • No main, declarar total := 100 e imprimir, mostrando que é independente.

Código inicial

package main

import "fmt"

func contador() {
	// implemente aqui
}

func main() {
	// chame contador e declare total local
}

Saída esperada

parcial: 1
parcial: 3
parcial: 6
total final: 6
total no main: 100
Ver dica

Dentro da função, total começa em 0. No main, você pode ter outra variável total com valor 100; elas são independentes.

Mostrar solução
package main

import "fmt"

func contador() {
	var total int // zero value: 0
	for i := 1; i <= 3; i++ {
		total += i
		fmt.Println("parcial:", total)
	}
	fmt.Println("total final:", total)
}

func main() {
	contador()
	total := 100 // variável local do main, independente
	fmt.Println("total no main:", total)
}

Passo a passo

  1. A função contador declara var total int — como não atribuímos valor, total começa em 0.
  2. O laço for i := 1; i <= 3; i++ itera com i valendo 1, 2 e 3.
  3. A cada iteração, total += i soma o valor de i ao total acumulado.
  4. Imprimimos parcial: seguido do total atual: após 1, total=1; após 2, total=3; após 3, total=6.
  5. Após o laço, imprimimos total final: com o valor 6.
  6. No main, chamamos contador() e depois declaramos total := 100. Essa variável é local do main e não tem relação com a de contador.
  7. Imprimimos total no main: 100, confirmando que o escopo da função é isolado.

Por que funciona

O zero value de int é 0, então total começa corretamente sem precisar de inicialização explícita. O escopo da variável total dentro de contador é local à função; a variável total declarada em main é outra completamente diferente. Isso demonstra como o escopo de bloco e função isola variáveis, evitando interferência entre partes do código.

Erros comuns

  • Esquecer de inicializar total com var: se usar total := 0, também funciona, mas o enunciado pede zero value explícito. A diferença é didática.
  • Declarar total fora da função: se total fosse global, o main e contador compartilhariam a mesma variável, e o valor final no main seria 6, não 100.
  • Usar i fora do laço: a variável i só existe dentro do for; tentar usá-la depois causa erro de compilação.
  • Confundir += com =+: total =+ i é válido mas atribui +i a total, zerando o acumulado. Use total += i.

Outra forma de resolver

Poderia usar total := 0 em vez de var total int, mas o zero value explícito reforça o conceito. Uma alternativa para o laço seria for i := 1; i < 4; i++, mas <= 3 é mais legível.

Saída esperada

parcial: 1
parcial: 3
parcial: 6
total final: 6
total no main: 100