Skip to content

Latest commit

 

History

History
42 lines (26 loc) · 2.14 KB

3-1-creating-confusion-with-octal-literals.md

File metadata and controls

42 lines (26 loc) · 2.14 KB

3.1 与八进制文字混淆

本章将讨论八位制字面表示的常见混淆,这可能会导致混淆甚至错误。

您认为以下代码的输出应该是什么?

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

我们还应该注意其他整数字面表示:

  • 二进制:0b0B 前缀。例如,0b100 等于十进制中的4。
  • 十六进制:0x0X 前缀。例如,在十进制中,0xF 等于15。
  • 虚数:i 后缀。例如,3i

最后,我们还可以使用下划线字符作为可读性的分隔符原因。例如,我们可以这样写10亿:1_000_000_000。下划线字符也可以与其他表示形式一起使用(例如,0b00_00_01)。

摘要,Go 处理二进制、十六进制、虚数和八进制数。八进制数以0开头。然而,为了提高可读性和潜力未来代码阅读器出错,我们应该明确八位数使用 0o 前缀。

在下一节中,我们将深入研究整数,并讨论如何在Go中处理溢出。