go整数进制转换分三类:fmt.printf仅格式化输出(如%b、%x),不返回字符串;strconv.formatint生成可处理的字符串(需int64+base=2/8/10/16);strconv.parseint解析字符串为整数(base指定原进制,bitsize限定结果类型)。

Go 里整数进制转换不是靠一个函数通吃,而是三类工具各司其职:fmt.Printf 专用于格式化输出,strconv.FormatInt 生成可处理的字符串,strconv.ParseInt 解析输入字符串。混用会 panic 或得到意外结果。
用 fmt.Printf 快速打印二进制/八进制/十六进制
只适合终端输出或日志调试,不返回字符串,不能拼接或序列化。
-
%b输出纯二进制数字(无0b前缀),负数按补码显示(如fmt.Printf("%b", -1)在 64 位系统下打出 64 个1) -
%o输出八进制,%x/%X输出小写/大写十六进制 - 加前缀用
%#x或%#X(如0xff),但%#b不合法 — Go 不支持自动加0b - 补零到固定宽度用
%08b(8 字符宽,左补 0),注意这是「字符宽度」,不是「保证 8 bit」;对负数无效 - 传入非整数类型(如
float64、string)会 panic,错误类似bad verb %x for string
用 strconv.FormatInt 生成进制字符串
当你需要把整数转成字符串做后续处理(比如存 JSON、拼 URL、写配置),必须用这个函数。
- 第一个参数必须是
int64,所以常见写法是strconv.FormatInt(int64(n), 2),漏掉类型转换会编译失败 -
base只能是2、8、10、16;传3或17不报编译错,但运行时 panic - 不带前缀、不补零 — 想要
"0b1010"得手动拼:"0b" + strconv.FormatInt(n, 2) - 对
uint8等无符号类型,必须先转int64:strconv.FormatInt(int64(myUint8), 2),不能直接传
用 strconv.ParseInt 解析进制字符串
从用户输入、配置文件、HTTP 参数等拿到的进制字符串(如 "1101"、"ff"、"0o755"),要用它变回整数。
- 第二个参数
base指明「字符串原本是什么进制」:二进制填2,八进制填8,十六进制填16;base = 0时才识别前缀("0x"→16,"0"→8) - 第三个参数
bitSize是关键:它限制返回值类型大小(8→int8,64→int64),不是“输入长度”。填8却解析"255"会返回ErrRange - 十六进制字母不区分大小写(
"FF"和"ff"都行),但二进制只认'0'和'1';多一个空格或换行就直接失败 -
ParseInt("0xFF", 16, 64)成功,但ParseInt("0xFF", 10, 64)失败 — 错在base,不是看字符串里有没有0x
最易忽略的点是:进制转换不是类型转换的副产品,而是有明确语义分工的操作。误把 fmt.Sprintf("%x", n) 当作可解析字符串用,或拿 ParseInt(s, 0, 64) 去解析没前缀的十六进制串,都会在边界 case 上翻车。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











