最简写法为%b输出二进制、%x/%x输出小写/大写十六进制;补零用%0nb,加0x前缀用%#x/%#x;仅支持整数类型,非整数会panic。

用 fmt.Printf 输出二进制和十六进制最简写法
Go 标准库的 fmt.Printf 支持直接格式化整数为二进制、八进制、十六进制,不需要手动转字符串或调用额外包。
关键就两个动词:%b(二进制)、%x(小写十六进制)或 %X(大写十六进制)。
示例:
fmt.Printf("%b\n", 42) // 输出: 101010
fmt.Printf("%x\n", 255) // 输出: ff
fmt.Printf("%X\n", 255) // 输出: FF
-
%b不补零,也不带前缀,纯裸数字;想加0b或0x得自己拼接 - 只对整数类型有效(
int、uint8等),对float64或字符串用会 panic - 负数按补码输出二进制(比如
fmt.Printf("%b", -1)在 int64 下输出一长串1),不是你想看的“带符号二进制”
需要补零或固定宽度?用 0 和数字宽度控制
默认输出不补零,但实际开发中常需要固定位宽(比如显示 8 位二进制、4 位十六进制),这时靠 fmt 的宽度修饰符就能搞定。
立即学习“go语言免费学习笔记(深入)”;
写法是:%0[宽度]b 或 %0[宽度]x,其中 0 表示左补零,数字表示最小字符宽度。
示例:
fmt.Printf("%08b\n", 5) // 输出: 00000101
fmt.Printf("%04x\n", 255) // 输出: 00ff
fmt.Printf("%04X\n", 10) // 输出: 000A
- 如果值本身超宽(比如
%04x打印0x12345),宽度修饰符无效,照常输出全部位数 - 补的是 ASCII
0字符,不是二进制位;所以%08b补的是字符数,不是“保证 8 个 bit”——它只对非负整数有意义 - 没有内置方式让
%b自动加0b前缀,得写成fmt.Printf("0b%08b", n)
想输出带前缀的十六进制?%#x 和 %#X 是标准解
很多场景(比如调试内存、序列化)要求输出带 0x 或 0X 前缀的十六进制,别手拼,fmt 提供了专用动词。
%#x 输出小写带 0x,%#X 输出大写带 0X。
fmt.Printf("%#x\n", 255) // 输出: 0xff
fmt.Printf("%#X\n", 255) // 输出: 0XFF
-
%#对%b无效——Go 不支持%#b输出0b前缀,这是常见误解点 -
%#x和宽度组合可用,比如%#06x输出0x00ff(注意:前缀占位,总宽含0x) - 对
0值,%#x仍输出0x0,不是空字符串
遇到 fmt.Printf 报错 “no formatting directive”?检查变量类型和动词匹配
这类错误通常不是语法写错,而是传入的值类型和格式动词不兼容,尤其在泛型或接口场景下容易踩坑。
典型报错:fmt.Printf("%x", "hello") → panic: bad verb %x for string;或者用 %b 打印 float64 也会失败。
-
%b、%x、%o只接受整数类型,包括int、int8~int64、uint系列、byte(即uint8) - 如果你有一个
interface{}或泛型参数T,必须先断言或约束为整数类型再格式化 - 想把字节切片(
[]byte)当十六进制打印?别用%x直接打切片,它会输出地址;应该用%x配合fmt.Printf("%x", []byte("hi"))—— 这是特例,fmt对[]byte有专门支持,输出6869
真正麻烦的不是记不住 %b 和 %x,而是忘记它们只吃整数、不处理浮点或字符串,也搞不清 %# 能干什么、不能干什么。补零逻辑和前缀逻辑是两套独立规则,混用时要盯紧宽度算的是“字符总数”还是“数值位数”。










