Médio Go
Escopo e shadowing
Enunciado
Crie um programa que declare uma variável x no escopo da função main com valor 10. Dentro de um bloco {}, declare outra variável x com valor 20 e imprima ambas. Depois do bloco, imprima novamente a variável externa para mostrar que ela não foi alterada.
Requisitos
- Declarar
xexterna com:=e valor10. - Dentro de um bloco
{}, declararxinterna com:=e valor20. - Imprimir os valores dentro e fora do bloco, mostrando que a externa permanece
10. - Usar comentários para indicar qual
xestá sendo impresso.
Código inicial
package main
import "fmt"
func main() {
// declare x externo
// bloco interno
// imprima x externo novamente
}
Saída esperada
x externo: 10
x interno: 20
x externo depois: 10
Ver dica
O := dentro do bloco cria uma nova variável, não altera a de fora. Use fmt.Println com rótulos diferentes.
Mostrar solução
package main
import "fmt"
func main() {
x := 10
fmt.Println("x externo:", x)
{
x := 20 // shadowing: nova variável x
fmt.Println("x interno:", x)
}
fmt.Println("x externo depois:", x)
}
Passo a passo
x := 10declara uma variávelxno escopo da funçãomain.- Imprimimos
x externo: 10. - Abrimos um bloco
{}e dentro dele usamosx := 20. Isso cria uma nova variávelx, que sombreia a externa apenas dentro desse bloco. - Imprimimos
x interno: 20— refere-se à variável interna. - Fechamos o bloco. A variável interna deixa de existir.
- Imprimimos novamente
x— agora refere-se à variável externa, que continua valendo10.
Por que funciona
O escopo em Go é léxico: uma variável é visível apenas dentro do bloco onde foi declarada. Quando você declara uma variável com o mesmo nome em um bloco interno, ocorre shadowing: a variável interna esconde a externa enquanto o bloco estiver ativo. Ao sair do bloco, a externa volta a ser visível. Isso é útil para evitar poluição de nomes, mas requer atenção para não modificar a variável errada.
Erros comuns
- Usar
=em vez de:=dentro do bloco:x = 20alteraria a variável externa, não criaria uma nova. O resultado seriax externo depois: 20. - Declarar
xcomvardentro do bloco:var x int = 20também cria uma nova variável, mas é mais verboso; o efeito de shadowing é o mesmo. - Esquecer as chaves: sem
{}, não há novo escopo;x := 20no mesmo escopo causaria erro de redeclaração.
Outra forma de resolver
Se a intenção fosse modificar a variável externa, usaríamos x = 20 (sem :). Mas o enunciado pede shadowing, então a solução acima é a correta.
Saída esperada
x externo: 10
x interno: 20
x externo depois: 10