Gafes em Go: confusões em octal
Seguindo o plano semi-aleatório que escolhi, vamos à primeira dica do capítulo 3, Data types, do livro 100 Go Mistakes and How to Avoid Them, de Teiva Harsanyi.
Dica #17: em octal, 010 == 8!
Título original da gafe #17: Creating confusion with octal literals (criando confusão com literais em octal).
A idade avançada dos criadores de Go fica evidente quando repetem
um vício da linguagem C e outras ferramentas do UNIX:
uma preferência por números octais, ou base 8, como no comando chmod do shell.
A preferência se revela por um atalho sintático: qualquer literal inteiro
que começa com o dígito 0 é considerado um número octal. Veja este exemplo:
func main() {
fmt.Println(1, 01, 7, 07, 10, 010, 42, 052)
}
A saída é:
1 1 7 7 10 8 42 42
Os inteiros 01, 07 e 010, 052 são lidos como base 8.
Os literais 08 e 09 são inválidos, porque octal só usa os dígitos de 0 a 7.
Harsanyi dá o exemplo da expressão 100 + 010 cujo resultado é 108 em decimal,
ou 0154 em octal, se você quiser me irritar.
Go também aceita literais inteiros com os prefixos 0b, 0x e 0o que
significam base 2 (binário), base 16 (hexadecimal), e base 8 (octal).
Lamentavelmente, as letras nestes prefixos podem ser maiúsculas,
então você pode escrever 0O154 para me irritar ainda mais.
Vamos adotar o prefixo em minúsculas: 0o154. Combinado?
A gafe está em escrever 052 em vez de 0o52 para representar o decimal 42 em octal.
Mas a gafe maior está no compilador Go, que não deveria aceitar esta notação confusa, insistindo num erro de projeto que já é literalmente mais velho do que eu.
Esta confusão também acontecia em Python, mas não mais.
Desde o Python 3 somos obrigados a usar o prefixo 0o
para escrever octal. Graças a Guido!
Este post é parte da série Estudando Go em 2026.