Blog do Ramalho.org

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.

Tags: