fmt.printf是go中唯一解析格式动词的函数;fmt.print和fmt.println仅拼接字符串,不处理%s、%d等动词,错误使用会导致格式串原样输出。

别用 fmt.Print 或 fmt.Println 做格式化输出——它们根本不解析 %s、%d 这类动词,只会把格式字符串当普通文本原样拼接。
为什么 fmt.Printf 是唯一真正能格式化的函数
fmt.Printf 是 Go 中唯一接受并解析格式动词的输出函数;fmt.Print 和 fmt.Println 只做字符串转换和空格/换行拼接,传入 "%s %d" 会照打出来,不会替换变量。
- 错误写法:
fmt.Println("name: %s, age: %d", "Alice", 30)→ 输出name: %s, age: %d Alice 30 - 正确写法:
fmt.Printf("name: %s, age: %d\n", "Alice", 30)→ 输出name: Alice, age: 30 -
fmt.Printf不自动换行,记得手动加\n,否则多条调用会挤在同一行 - 参数个数必须与动词数量严格匹配,否则运行时 panic
%v、%+v、%#v 在调试结构体时的区别
这三个通用动词行为差异直接影响你一眼能否看清结构体内容,不是风格偏好,而是效率问题。
-
%v:只输出字段值,无字段名 ——{123 "foo" true} -
%+v:带字段名,适合确认字段赋值是否符合预期 ——{ID:123 Name:"foo" Active:true} -
%#v:输出可直接复制进代码的 Go 字面量,含包路径和类型 ——main.User{ID:123, Name:"foo", Active:true} -
%#v对nil切片或 map 明确输出nil,而%v可能只显示[]或{},容易误判为空集合
数字补零、对齐和进制转换怎么写才不踩坑
固定宽度、补零、进制等需求看似简单,但修饰符顺序和类型限制稍不注意就出错。
- 补零两位整数:
%02d(不是%2d,后者补空格);负数如-5用%03d才得-05 - 十六进制带
0x前缀:%#x(%#b无效,Go 不支持);%#06x表示总宽至少 6 字符,含0x,如0x00ff - 二进制补 8 位:
%08b,但注意它补的是字符数,不是“保证 8 bit”——对负数按补码输出,通常不符合预期 -
%b、%x、%o只接受整数类型;传float64或string会 panic
写文件时别直接用 fmt.Printf,该用 fmt.Fprintf
fmt.Printf 固定输出到终端,要写文件必须换函数,且需确保 io.Writer 可用、已打开、有写权限。
- 正确姿势:
fmt.Fprintf(file, "id=%06d, name=%q\n", id, name),第一个参数是*os.File或*bufio.Writer - 别漏错误检查:
file, err := os.Create("log.txt")后必须判断err != nil,否则fmt.Fprintf可能静默失败 - 高频写入建议套一层
bufio.NewWriter,避免每次调用都触发系统写,否则性能断崖式下降 - 写完记得
buf.Flush()或file.Close(),否则缓冲区内容可能丢失
最常被忽略的是动词和类型的硬性匹配——%d 就不能传 float64,%x 就不能传 string,Go 不做隐式转换,报错就是 runtime panic,没商量余地。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











