
Go 里怎么写十六进制和八进制字面量
Go 支持直接在代码里用 0x 或 0X 开头写十六进制,0 开头(且后续只含 0-7)写八进制。注意:没有 0o 或 0b 前缀——Go 不支持八进制的 0o 写法,也不支持二进制字面量(1.21 才加 0b,但老版本没这玩意)。
常见错误现象:08、09 会直接编译失败,报 syntax error: invalid digit 8 in octal literal;想写八进制却用了 0o777,会提示 undefined identifier o777(被当变量名了)。
-
0xFF、0xff都合法,值为 255 -
0177是八进制,值为 127;0777是 511 -
08、09、0xG1这类非法字符直接拒编译
fmt.Printf 输出十六进制和八进制格式
用 fmt.Printf 打印整数时,%x / %X 输出小写/大写十六进制,%o 输出八进制。注意:它们不带前缀,只是纯数字;如果需要 0x 或 0 前缀,得手动拼或用 %#x、%#o。
使用场景:调试内存地址、权限掩码(如 0644)、协议字段编码。
立即学习“go语言免费学习笔记(深入)”;
-
fmt.Printf("%x", 255)→ff -
fmt.Printf("%#x", 255)→0xff -
fmt.Printf("%#o", 511)→0777 -
%o对负数输出带符号的八进制(如-1→37777777777,取决于 int 大小),一般避免对负数用%o
字符串转十六进制/八进制:strconv.ParseInt 的坑
把字符串转成整数时,必须显式传进制参数给 strconv.ParseInt。写成 strconv.ParseInt("ff", 16, 64) 没问题,但写成 strconv.ParseInt("0xff", 16, 64) 就会失败——因为 ParseInt 不识别前缀,它只认纯数字部分。
容易踩的坑:误以为能像 Python 的 int("0xff", 16) 那样自动跳过前缀;或者传错进制数(比如把八进制字符串传 8,但字符串里混了 8 或 9)。
- 十六进制字符串要去掉
0x:用strings.TrimPrefix(s, "0x")再解析 - 八进制字符串同理,先去
0前缀(但注意:原生八进制字面量可带多个0,而字符串解析只认一个有效前缀) - 进制参数只能是
2、8、10、16,传0会 panic - 返回值第二个是
error,别忽略;"g"在 base 16 下也报错,不是所有字母都接受
byte 切片和 hex 编码互转:encoding/hex 最常用路径
实际开发中更多见的是把 []byte 转成十六进制字符串(比如哈希值、密钥摘要),或反向解码。这时候该用 encoding/hex 包,而不是手撸循环或 fmt.Sprintf。
性能影响:直接用 fmt.Sprintf("%x", data) 简单但慢,尤其对大 slice;hex.EncodeToString 是优化过的,分配少、速度快。
-
hex.EncodeToString([]byte("hi"))→"6869" -
hex.DecodeString("6869")返回[]byte{0x68, 0x69}和nilerror - 输入字符串长度必须为偶数,否则
DecodeString返回 error:encoding/hex: odd length hex string - 不支持大小写混合;
"6869"行,"686G"不行
进制转换本身不难,难的是边界情况:前缀要不要、大小写敏感不敏感、错误是否静默吞掉、字节对齐有没有强制要求。这些地方一松懈,线上就出 panic 或错位解析。










