Médio Go
Bit Flags para Permissões
Enunciado
Defina um tipo Permissao (uint) e use iota com deslocamento bit a bit para criar as flags Ler, Escrever e Executar. No main, crie uma permissão combinada Ler | Escrever, verifique se ela contém Ler e Executar, e imprima os resultados.
Requisitos
- Usar
1 << iotapara definir as flags como potências de dois. - Combinar permissões com o operador
|. - Verificar a presença de uma flag com
&e comparar com zero. - Imprimir se cada permissão está presente.
Código inicial
package main
import "fmt"
type Permissao uint
// TODO: defina as constantes com iota e deslocamento
func main() {
// TODO: combine permissões e verifique
}
Saída esperada
Permissão: 3
Tem leitura? true
Tem execução? false
Ver dica
Use const ( Ler Permissao = 1 << iota; Escrever; Executar ) e depois p := Ler | Escrever.
Mostrar solução
package main
import "fmt"
type Permissao uint
const (
Ler Permissao = 1 << iota // 1 << 0 = 1
Escrever // 1 << 1 = 2
Executar // 1 << 2 = 4
)
func main() {
p := Ler | Escrever // combina permissões: 1 | 2 = 3
fmt.Println("Permissão:", p)
fmt.Println("Tem leitura?", p&Ler != 0)
fmt.Println("Tem execução?", p&Executar != 0)
}
Passo a passo
- Declaramos
type Permissao uintpara representar o conjunto de bits. - No bloco
const,Lerrecebe1 << iota(iota=0 → 1). EscrevereExecutarrepetem a expressão, com iota incrementando (1<<1=2, 1<<2=4).- No
main,p := Ler | Escreverusa o operador OR bit a bit para combinar as flags (1 | 2 = 3). - Verificamos se uma flag está presente com
p&flag != 0.
Por que funciona
Cada flag ocupa um bit único, então a combinação com | ativa os bits correspondentes. O teste p&flag != 0 verifica se aquele bit específico está ligado. Isso permite representar múltiplas permissões em um único valor inteiro.
Erros comuns
- Usar
1 << iotasem o tipo:const ( Ler = 1 << iota; ... )criaria constantes não tipadas; ainda funciona, mas perde a tipagem forte. - Esquecer de usar
!= 0na verificação:if p & Lernão compila, pois&retorna um valor numérico, não booleano. - Combinar com
+em vez de|: se as flags não forem potências de dois,+pode causar sobreposição. Use|para segurança.
Outra forma de resolver
Use p&Ler == Ler em vez de != 0; é equivalente quando a flag tem um único bit.
Saída esperada
Permissão: 3
Tem leitura? true
Tem execução? false