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
contadordeve usarvar total int(zero value). - O laço deve ir de 1 a 3 e somar
iatotal. - Imprimir o total parcial a cada iteração e o total final após o laço.
- No
main, declarartotal := 100e 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
- A função
contadordeclaravar total int— como não atribuímos valor,totalcomeça em0. - O laço
for i := 1; i <= 3; i++itera comivalendo 1, 2 e 3. - A cada iteração,
total += isoma o valor deiao total acumulado. - Imprimimos
parcial:seguido do total atual: após 1, total=1; após 2, total=3; após 3, total=6. - Após o laço, imprimimos
total final:com o valor 6. - No
main, chamamoscontador()e depois declaramostotal := 100. Essa variável é local domaine não tem relação com a decontador. - 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
totalcomvar: se usartotal := 0, também funciona, mas o enunciado pede zero value explícito. A diferença é didática. - Declarar
totalfora da função: setotalfosse global, omainecontadorcompartilhariam a mesma variável, e o valor final nomainseria 6, não 100. - Usar
ifora do laço: a variávelisó existe dentro dofor; tentar usá-la depois causa erro de compilação. - Confundir
+=com=+:total =+ ié válido mas atribui+iatotal, zerando o acumulado. Usetotal += 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