本章将讨论八位制字面表示的常见混淆,这可能会导致混淆甚至错误。
您认为以下代码的输出应该是什么?
sum := 100 + 010
fmt.Println(sum)
乍一看,我们可能会期望此代码打印100+10 = 110的结果 。然而,它将打印108。怎么可能?
在 Go 中,我们必须知道以0开头的整数字面是被认为是八进制整数(八进制)。八进制中的10等于十进制中的8。因此,总和等于100 + 8 = 108。它是一个重要的属性请记住整数文字,以避免阅读时的混淆。例如,上面代码。
八进制整数在不同场合很有用。例如,如果我们想使用 os.OpenFile
打开文件。此函数需要将权限作为 uint32
传递。如果我们想匹配 Linux 权限,我们可以传递一个八进制数来提高可读性,而不是一个十进制数:
file, err := os.OpenFile("foo", os.O_RDONLY, 0644)
此外,我们应该知道,可以在零之后添加一个 o
字符(小写字母):
file, err := os.OpenFile("foo", os.O_RDONLY, 0o644)
使用 0o
作为前缀而不是仅使用 0
意味着相同的含义;然而,它可以帮助使代码更清晰。
Note 我们也可以使用大写
O
字符而不是小写o
。然而,通过0O644
可能会增加混乱,因为根据字符字体,0
很像O
。
我们还应该注意其他整数字面表示:
- 二进制:
0b
或0B
前缀。例如,0b100
等于十进制中的4。 - 十六进制:
0x
或0X
前缀。例如,在十进制中,0xF
等于15。 - 虚数:
i
后缀。例如,3i
。
最后,我们还可以使用下划线字符作为可读性的分隔符原因。例如,我们可以这样写10亿:1_000_000_000
。下划线字符也可以与其他表示形式一起使用(例如,0b00_00_01
)。
摘要,Go 处理二进制、十六进制、虚数和八进制数。八进制数以0开头。然而,为了提高可读性和潜力未来代码阅读器出错,我们应该明确八位数使用 0o
前缀。
在下一节中,我们将深入研究整数,并讨论如何在Go中处理溢出。