Iniciando em Go — Escopos

Você já deve estar acostumado com escopos em linguagens de programação, vamos ver como são os escopos em Go.

Escopos em Go

Essa imagem mostra todos os escopos em Go.

Em Go, o escopo de dentro pode acessar o de fora, mas não o contrário. Por exemplo, o escopo Function pode acessar todos os outros escopos, mas de dentro do escopo File não conseguimos acessar o que foi declarado dentro de Function.

Escopo Universe

Esse escopo é utilizado somente para os identificadores pré-declarados da linguagem.

Os identificadores presentes no escopo Universe são:

Tipos:
bool byte complex64 complex128 error float32 float64 int int8
int16 int32 int64 rune string uint uint8 uint16 uint32 uint64
uintptr
Constantes:
true false iota
Valor zero:
nil
Funções:
append cap close complex copy delete imag len make new panic
print println real recover

Todos esses identificadores podem ser acessados de qualquer outro escopo, pois foram declarados no escopo Universe.

Escopo Package

Variáveis e funções atribuídas ao escopo do pacote, podem ser acessadas de qualquer arquivo do mesmo pacote.

Esse escopo define tudo que pode ser acessado dentro de um mesmo pacote.

Se uma variável ou função for criada fora de um bloco, ela é atribuída ao escopo Package e pode ser acessada de qualquer arquivo dentro do mesmo pacote. Exemplo:

// Arquivo arquivo1.go
package meupacote
var nome = “Lucas Magnum”
// Arquivo arquivo2.go
package meupacote
import “fmt”
func print_nome(){
fmt.Println(nome)
}

A variável nome foi declarada sem pertencer a nenhuma função ou bloco especifico, dessa forma ela assumiu o escopo Package do pacote meupacote e pode ser acessada em qualquer arquivo do mesmo pacote. Da mesma forma a função print_nome poderia ser acessada de um outro arquivo no pacote.

Escopo File

Imports só podem ser acessados dentro dos arquivos onde foram declarados.

O escopo file define o que pode ser acessado somente dentro de um arquivo, isso se restringe basicamente aos imports que só podem ser acessados no arquivo que foram declarados. Exemplo:

// Arquivo arquivo1.go
package meupacote
import “fmt”
func minha_funcao(){
fmt.Println(“Test minha funcao”)
}
// Arquivo arquivo2.go
package meupacote
func minha_outra_funcao(){
fmt.Println(“Test minha outra funcao”)
}

No arquivo arquivo2.go não conseguimos utilizar o pacote fmt pois ele só foi importado no arquivo1.go.

Escopo Function

O escopo Function define o escopo dos blocos em Go.

Um bloco pode ser uma função, um if , um switch , um for ou um bloco declarado com { e } .

Dessa forma, uma variável declarada dentro de um if, for, switch ou qualquer outro bloco, não poderá ser acessada fora desse escopo.

Exemplo:

package main
import “fmt”
func main(){ // Inicio do escopo da função
     fmt.Println(“Essa linha será printada”)
     y := “Escopo da função”
     { // Bloco explicitamente criado

x := “Escopo reservado” // x está no escopo do bloco

fmt.Println(y) // y pertence ao escopo de fora

}
     fmt.Println(x) // ERROR: x não pode ser acessado fora do seu escopo
}

Note que podemos acessar a variável y, isso acontece porque o escopo em que x foi declarado, está dentro do escopo de y (lembre-se, o acesso pode ser de dentro pra fora).

Não podemos fazer o contrário, pois x foi declarado dentro de um bloco especifico e não podemos acessar o que foi declarado dentro desse bloco pelo lado de fora (não é possível acessar de fora pra dentro).

O escopo de uma variável, só começa na sua declaração. Então não podemos acessar uma variável antes dela ser declarada. Exemplo:

package main
import “fmt”
func main(){
fmt.Println(x)
x := “Hello world”
}

Esse código não irá executar, pois estamos tentando acessar a variável x
antes dela existir.

O escopo de uma variável começa na sua declaração e finaliza junto com o escopo em que foi declarada.

É isso aí, um pouco sobre os escopos em Go =)

  • Vimos que uma variável criada dentro de uma função, não pode ser acessada fora da mesma, escopo Function.
  • Vimos que uma variável pode ser acessada por qualquer arquivo do pacote quando seu escopo é Package.
  • Vimos que um import tem seu escopo mantido somente no arquivo em que foi declarado, escopo File.
  • Vimos que o escopo Universe vale somente para os identificadores pré-declarados da linguagem.

Links úteis:

Iniciando em Go

Like what you read? Give Lucas Magnum a round of applause.

From a quick cheer to a standing ovation, clap to show how much you enjoyed this story.