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 << iota para 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

  1. Declaramos type Permissao uint para representar o conjunto de bits.
  2. No bloco const, Ler recebe 1 << iota (iota=0 → 1).
  3. Escrever e Executar repetem a expressão, com iota incrementando (1<<1=2, 1<<2=4).
  4. No main, p := Ler | Escrever usa o operador OR bit a bit para combinar as flags (1 | 2 = 3).
  5. 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 << iota sem o tipo: const ( Ler = 1 << iota; ... ) criaria constantes não tipadas; ainda funciona, mas perde a tipagem forte.
  • Esquecer de usar != 0 na verificação: if p & Ler nã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