Aprendi hoje: iota um enum com instaminas do Golang
Estou estudando golang, e muitas outras coisas junto na verdade, e quando estava vendo esse video, sim é um vídeo de 7 horas, em especial na parte de constanst, aprende sobre essa maravilhasinha do go, iota.
Se você como eu ja foi forçado programou em C na faculdade, ja deve ter visto algo como isso aqui:
Os famosos enum, presentes em muitas linguagens, muito uteis para associar um número com uma palavra o que fica bem mais fácil de ler no código. Para quem não sabe o enum basicamente associa numeros automaticamente aos items iniciando do zero, no exemplo acima Dom = 0, Seg = 1, Ter = 2, e assim por diante.
As aplicações são das mais variadas desde associar um status a um número que sera salvo no banco de dados, o que vai ocupar bem menos espaço, a tratar opçoes do menu de um programa de linha de comando. O uso é bem recomendado afinal é bem mais legivel setar o status de um cliente como Inadinplente do que 4, que não representa droga nenhuma.
Em golang também temos enums, mas temos uma alternativa para esse uso: o iota!
Com o código acima vamos ter basicamente o mesmo resultado dos enums do C, você tbm não precisa escrever iota toda vez, abreviando temos:
Mas por que usar iota? Porque ele é muito mais poderoso que o enum do C, por exemplo podemos ignorar o primeiro item e assim pularmos o zero:
E além disso podemos aplicar operações aritméticas para o iota!
Com o exemplo acima temos a mesma coisa do anterior, mas qualquer operação aritmética? Sim!
E você ainda pode mudar a operação no meio do bloco, admito pra isso ainda não achei utilidade:
E para o gran finale, mascaras de bits! Sim algo bem parecido com o que alguns sistemas usam para permissionamento:
Explicando um pouco melhor este uso, que é mais de binario do que iota, o operador << vai incrementar n bits para frente, então 0001 << 0 = 0001, 0001 << 1 = 0010, 0001 << 2 = 0100 e assim por diante. No nosso exemplo anterior:
O operador | vai pegar dois binarios e retornar um binario “unindo” os bits das permissões, no nosso exemplo: 100 | 010 = 110, ja o operador & vai nos retornar um binário comparando bit a bit da permisão com as permissoes do usuário, no nosso exemplo: 110 & 001 = 000, ou seja o usuário não é um admin.
Uma ultima coisa sobre o iota o seu valor é resetado quando sai do bloco de declaração:
Dúvidas, em especial nesse último, por favor deixe nos comentários!