Go Fundamentos Básico
Constantes e iota
Em Go, constantes são valores imutáveis definidos em tempo de compilação. Elas podem ser tipadas (com um tipo explícito) ou não tipadas (sem tipo declarado, assumindo o tipo padrão quando necessário). Constantes não tipadas oferecem maior flexibilidade em expressões.
O identificador pré-declarado iota é usado em declarações const para gerar uma sequência de valores inteiros incrementais. Ele é reiniciado a cada bloco const e incrementa a cada linha (ou grupo de linhas) dentro do bloco. Isso permite criar enums idiomáticos de forma concisa.
Além disso, iota combinado com deslocamentos bit a bit (1 << iota) é a maneira idiomática de definir bit flags, onde cada constante representa um único bit em um campo de bits. Essas flags podem ser combinadas com operadores bit a bit (|, &, ^) para representar conjuntos de opções.
Neste card, você aprenderá a declarar constantes tipadas e não tipadas, usar iota para enums e bit flags, e aplicar essas técnicas em situações práticas.
Pontos-chave
- Constantes são imutáveis e avaliadas em tempo de compilação.
constpode ser tipada (const X int = 10) ou não tipada (const X = 10).iotaincrementa automaticamente dentro de um blococonst, começando em 0.- Enums em Go são criados com
iotae um tipo personalizado (ex.:type Dia int). - Bit flags usam
1 << iotapara definir potências de dois.
package main
import "fmt"
// Constantes não tipadas (sem tipo explícito)
const (
Nome = "Go"
Versao = 1.21
Ativo = true
)
// Constante tipada
const Pi float64 = 3.14159
// Enum idiomático com iota
type Dia int
const (
Domingo Dia = iota // 0
Segunda // 1
Terca // 2
Quarta // 3
Quinta // 4
Sexta // 5
Sabado // 6
)
// Bit flags com iota e deslocamento
type Permissao uint
const (
Ler Permissao = 1 << iota // 1 << 0 = 1
Escrever // 1 << 1 = 2
Executar // 1 << 2 = 4
)
func main() {
fmt.Println("Nome:", Nome)
fmt.Println("Versao:", Versao)
fmt.Println("Ativo:", Ativo)
fmt.Println("Pi:", Pi)
fmt.Println("\nDias da semana:")
for d := Domingo; d <= Sabado; d++ {
fmt.Printf("%d: %s\n", d, d)
}
fmt.Println("\nPermissões:")
p := Ler | Escrever
fmt.Println("Permissão:", p)
fmt.Println("Tem leitura?", p&Ler != 0)
fmt.Println("Tem execução?", p&Executar != 0)
}
// String method para o tipo Dia (para impressão amigável)
func (d Dia) String() string {
dias := [...]string{"Domingo", "Segunda", "Terça", "Quarta", "Quinta", "Sexta", "Sábado"}
if d < Domingo || d > Sabado {
return fmt.Sprintf("Dia(%d)", int(d))
}
return dias[d]
}