Go语言中常见100问题-#17 Creating confusion with octal literals
2023-06-13 09:15:58 时间
进制混淆
先来看一个对八进制数字表示有误解的例子,你认为下面的程序输出结果是多少?
sum := 100 + 010
fmt.Println(sum)
咋一看,我们可能认为上述程序输出结果为110(100+10),但实际上输出结果为108,这是为什么呢?在Go语言中,以0开头的整数被判断为八进制整数,所以010等于十进制中的8,因此上面的程序结果为100+8=108. 这个小知识点需要我们留意,避免以后在阅读代码时混淆。
八进制整数在不同的场景中很有用,例如,假设我们想要使用 os.OpenFile 打开一个文件,该函数需要将权限作为 uint32 类型传递,如果我们想匹配linux文件权限,可以传递一个八进制数字而不是一个十进制数字。
file, err := os.OpenFile("foo", os.O_RDONLY, 0644)
在上面的示例中,0644 表示特定的linux权限(对所有者可读可写,对其他人员只可读),也可以在零之后添加一个 o 字母(小写),如下所示,
file, err := os.OpenFile("foo", os.O_RDONLY, 0o644)
使用 0o 作为前缀与 0 作为前缀是等价的,但是,使用 0o 作为前缀具有更好的阅读性,使得代码更清晰。
「NOTE:也可以使用大写字母 O 替换小写字母 o. 但是传 0O644 会不容易区分,增加混乱性,因为字母 O 和数字 0 长的很像。」
除了上面的八进制,我们还应该注意整数的其他进制表示:
- 二进制:使用 0b 或 0B 前缀,例如 0b100等于十进制中的4.
- 十六进制:使用 0x 或 0X 前缀,例如 0xF等于十进制中的15.
- 虚数:使用 i 后缀,例如 3i.
为了便于阅读,我们还可以使用下划线字符(_)作为分割符,例如,10亿可以这样表示:1_000_000_000. 此外,还可以将下划线字符与其它表示形式一起使用,像 0b00_00_01 表示的十进制数为1。
总结,Go语言支持 二进制、十六进制、虚数和八进制数字表示。八进制以0开头,但是,为了提高程序可读性并避免其它人员可能的错误理解,使用 0o 前缀明确数字为八进制数。
相关文章
- Go语言数据类型之特殊常量iota的使用(九)
- 「Go工具箱」go语言csrf库的使用方式和实现原理
- 2022-10-20:以下go语言代码输出什么?A:7;B:7.0;C:0;D:编译错误。package mainimport
- Go语言中常见100问题-#2 Unnecessary nested code
- Go语言中常见100问题-#11 Not using the functional options pattern
- Go语言中常见100问题-#18 Neglecting integer overflows
- Go 语言 context 最佳实践
- GO语言开篇-Go语言急速入门(基础知识点)| 青训营笔记
- 开心档之Go 语言环境安装
- Linux运维必知必会的Go语言核心知识,找齐了 | 极客时间
- Go语言——测试与性能
- Go语言圣经-基于select的多路复用习题详解编程语言
- Go语言圣经–示例: 并发的Clock服务习题详解编程语言
- 深度探索Go语言与Redis结合(go-redis)
- 用Go语言做极简风格网址导航
- 简易教程:如何在 Linux 上安装 GO 语言(go语言安装linux)
- 以Go语言操作MySQL:轻松运行数据库各种查询(go语言mysql)
- 如何在Linux上安装Go语言?——简单易懂的指南(linux安装go语言)
- 前行不止Go语言监听Oracle日志(go监听oracle日志)
- 程序Go语言调用Oracle数据库驱动程序指南(go oracle驱动)
- 创建第一个Go语言程序Hello,Go!
- GO语言异常处理机制panic和recover分析