1. Variáveis e Constantes

Em Golang, variáveis e constantes são dois conceitos fundamentais que desempenham um papel muito importante em um programa.

  • Uma variável é um identificador nomeado usado para armazenar dados em um programa. Em Golang, a palavra-chave var é usada para declarar variáveis.
  • Uma constante é um identificador cujo valor não pode ser alterado no programa. Em Golang, a palavra-chave const é usada para declarar constantes.

2. Declaração e Inicialização de Variáveis Golang

2.1 Declaração e Atribuição de uma Única Variável

Na linguagem Go, a palavra-chave var é usada para declarar uma variável com o formato var nome_variavel tipo. Após a declaração, a variável pode receber um valor no código subsequente, ou pode ser inicializada diretamente no momento da declaração. Por exemplo:

var idade int // Declara uma variável do tipo inteiro chamada idade
idade = 25    // Atribui um valor à variável

var nome string = "Alice" // Declara e inicializa a variável nome

2.2 Declaração de Múltiplas Variáveis

A linguagem Go suporta a declaração simultânea de várias variáveis, o que pode tornar o código mais conciso. A declaração em bloco geralmente é feita no início de uma função ou no nível do pacote. Por exemplo:

var (
    primeiroNome, segundoNome string
    idade                      int
)

primeiroNome = "João"
segundoNome = "Silva"
idade = 30

Na declaração em bloco acima, primeiroNome e segundoNome são declarados como strings, enquanto idade é um número inteiro.

2.3 Inferência de Tipo e Declaração de Variável Curta

Na linguagem Go, nem sempre é necessário especificar explicitamente o tipo da variável. Se uma expressão de inicialização for fornecida ao declarar uma variável, o tipo da variável pode ser inferido. Isso é conhecido como inferência de tipo. A declaração curta de variável usando := pode simplificar a declaração e inicialização de variáveis com base na inferência de tipo. Por exemplo:

cidade := "Rio de Janeiro" // Usando a declaração curta de variável para declarar e inicializar cidade
país := "Brasil" // O país é inferido como tipo string

Vale ressaltar que a declaração curta de variáveis só pode ser usada dentro de funções e não pode ser usada em escopo global.

2.4 Declaração de Variáveis Fora de Funções

Variáveis declaradas fora de funções têm escopo de nível de pacote. Essas variáveis são visíveis e acessíveis em todo o pacote. Por exemplo:

var varGlobal string = "Eu sou global" // Declaração de uma variável global

func imprimirVarGlobal() {
    fmt.Println(varGlobal) // Acessando a variável global dentro da função
}

Variáveis globais podem ser compartilhadas entre qualquer função dentro do pacote, mas devem ser usadas com cuidado para evitar possíveis conflitos de nomeação e referências pouco claras.

Dica: Entender o código básico da função aqui é suficiente, explicações detalhadas das funções serão fornecidas em seções posteriores.

3 Tipos de Dados Básicos e Valores Zero

3.1 Tipos de Dados Básicos em Golang

Na linguagem Go, cada tipo de variável fornece semânticas explícitas e características comportamentais. Aqui estão alguns tipos de dados básicos comuns:

  • int, int8, int16, int32, int64: Diferentes faixas de inteiros
  • uint, uint8, uint16, uint32, uint64: Inteiros não assinados
  • float32, float64: Números de ponto flutuante
  • bool: Valores booleanos (verdadeiro ou falso)
  • string: Strings

3.2 Conceito de Valores Zero

Na linguagem Go, as variáveis são automaticamente inicializadas com o valor zero de seu tipo após a declaração. Valor zero refere-se ao valor padrão do tipo correspondente quando uma variável não é explicitamente inicializada. Isso não é comum em algumas outras linguagens, mas no Go, garante que todas as variáveis sempre tenham um valor inicial válido. Aqui estão os valores zero para cada tipo de dados básico:

  • O valor zero para um número inteiro é 0
  • O valor zero para um número de ponto flutuante é 0.0
  • O valor zero para um valor booleano é falso
  • O valor zero para uma string é uma string vazia ""

Por exemplo:

var i int     // O valor zero é 0
var f float64 // O valor zero é 0.0
var b bool    // O valor zero é falso
var s string  // O valor zero é ""

Compreender o conceito de valores zero é muito importante, pois pode ajudar os desenvolvedores a entender o comportamento da inicialização de variáveis e pode ser usado para evitar erros de ponteiro nulo ou não inicializado.

4. Escopo de Variáveis

4.1 Variáveis Locais

Variáveis locais são variáveis definidas dentro de uma função e só podem ser acessadas dentro dessa função. Os parâmetros de uma função também pertencem às variáveis locais. Desde o momento em que são criadas até que a execução da função seja concluída, as variáveis locais desaparecerão. Cada vez que uma função é chamada, as variáveis locais são recriadas.

func exemploVariavelLocal() {
    var variavelLocal int = 10 // Esta é uma variável local
    fmt.Println(variavelLocal)
}

func main() {
    exemploVariavelLocal() // Saída: 10
    // fmt.Println(variavelLocal) // Isso causará um erro de compilação, pois variavelLocal não é visível aqui
}

No exemplo acima, variavelLocal só pode ser acessada dentro da função exemploVariavelLocal.

4.2 Variáveis Globais

Variáveis globais são variáveis definidas fora das funções e podem ser acessadas em qualquer arquivo dentro do mesmo pacote. Se você deseja usar variáveis globais em outros pacotes, o nome da variável deve começar com uma letra maiúscula, de acordo com as regras de controle de acesso do Go.

package main

import "fmt"

var variavelGlobal int = 20 // Esta é uma variável global

func main() {
    fmt.Println(variavelGlobal) // Saída: 20
    alterarGlobal()
    fmt.Println(variavelGlobal) // Saída: 30
}

func alterarGlobal() {
    variavelGlobal = 30 // Alterar o valor da variável global
}

Neste exemplo, variavelGlobal é visível tanto na função main quanto na função alterarGlobal.

5 Declaração e Uso de Constantes

5.1 A Palavra-chave const

Usamos a palavra-chave const para definir constantes. Constantes são valores que não podem ser modificados e, uma vez definidos, seu valor não pode ser alterado. As constantes podem ser de qualquer tipo de dado básico, como inteiros, números de ponto flutuante, booleanos ou strings.

const Pi = 3.14 // Declarar uma constante do tipo float
const StrConst string = "Olá, Mundo!" // Declarar uma constante do tipo string

func main() {
    fmt.Println(Pi)
    fmt.Println(StrConst)
}

5.2 Constantes Enumeradas

A linguagem Go não possui um tipo de enumeração específico, mas você pode usar a palavra-chave iota para alcançar a enumeração. Dentro de um bloco const, cada declaração adicional de constante incrementará o valor de iota em 1.

const (
    Domingo = iota  // 0
    Segunda         // 1
    Terça           // 2
    Quarta          // 3
    Quinta          // 4
    Sexta           // 5
    Sábado          // 6
)

func main() {
    fmt.Println(Domingo)    // Saída: 0
    fmt.Println(Sábado)     // Saída: 6
}

O código acima declara uma enumeração para os dias da semana, onde iota é inicializado como 0 dentro do bloco const e incrementa em 1 para cada declaração subsequente.

5.3 Escopo de Constantes

O escopo das constantes é semelhante ao das variáveis. Se uma constante é definida dentro de uma função, seu escopo é limitado a essa função. Se uma constante é definida fora de uma função (globalmente), seu escopo é o pacote inteiro e, se a primeira letra for maiúscula, ela pode ser acessada em outros pacotes.

Gerenciar o escopo das constantes ajuda a reduzir a poluição do escopo global e melhora a manutenção e legibilidade do programa.

const ConstGlobal = "Esta é uma constante global"

func main() {
    const ConstLocal = "Esta é uma constante local"
    fmt.Println(ConstGlobal)  // Isto é válido
    fmt.Println(ConstLocal)   // Isto é válido
}

func outraFuncao() {
    // fmt.Println(ConstLocal) // Isso causará um erro de compilação: ConstLocal não é visível nesta função
    fmt.Println(ConstGlobal)  // Isto é válido
}

Neste exemplo, ConstLocal só pode ser acessada dentro da função main, enquanto ConstGlobal pode ser acessada em todo o pacote.