一、常用输出函数(按输出目标分类)
| 函数 | 说明 | 示例 |
|---|
Print / Println / Printf | 输出到标准输出 | fmt.Println("Hello") |
Fprint / Fprintln / Fprintf | 输出到任意 io.Writer | fmt.Fprintf(os.Stderr, "err: %v", err) |
Sprint / Sprintln / Sprintf | 格式化结果返回字符串(不打印) | s := fmt.Sprintf("age=%d", 20) |
Errorf | 格式化后返回 error 类型 | return fmt.Errorf("invalid: %v", val) |
Println/Sprintln/Fprintln 会自动在末尾加换行,Print 不加;Printf 需要显式写 \n。
二、常用格式占位符(格式化动词)
| 动词 | 用于 | 示例输出 |
|---|
%v | 任意类型的默认格式 | 123 "abc" [1 2] |
%#v | Go 语法表示(带类型/引号) | "abc" []int{1,2} |
%T | 值的类型 | int string []int |
%% | 百分号字面量 | % |
| 整数 | | |
%d | 十进制 | 123 |
%b | 二进制 | 1111011 |
%o | 八进制 | 173 |
%x / %X | 十六进制(小写/大写) | 7b / 7B |
%c | Unicode 字符 | { (ASCII 123) |
| 浮点数 | | |
%f | 十进制小数 | 3.141593 |
%.2f | 指定小数位数 | 3.14 |
%e / %E | 科学计数法 | 3.141593e+00 |
%g | 自动选择 %f 或 %e | 更紧凑 |
| 字符串/字节切片 | | |
%s | 原始字符串 | hello |
%q | 带双引号的字符串 | "hello" |
%x | 十六进制字节 | 68656c6c6f |
| 指针 | | |
%p | 十六进制地址 | 0xc0000140f0 |
| 布尔 | | |
%t | true 或 false | true |
三、宽度与精度
通用格式:%[flags][width][.precision]verb
| 示例 | 含义 |
|---|
%5d | 宽度 5,右对齐,不足补空格 |
%-5d | 宽度 5,左对齐 |
%05d | 宽度 5,右对齐,前补零 |
%5.2f | 总宽度 5(含小数点),小数 2 位 |
%5s | 最小宽度 5 的字符串 |
%q 或 %x | 也可跟宽度/精度 |
四、常用辅助函数
| 函数 | 作用 |
|---|
fmt.Scan / Scanf / Scanln | 从标准输入读取格式化数据 |
fmt.Fscan / Fscanf | 从 io.Reader 读取 |
fmt.Sscan / Sscanf | 从字符串解析 |
五、自定义格式化(Stringer 接口)
任何类型实现 String() string 方法后,使用 %v、%s、Print 等都会自动调用该方法。
1
2
3
4
| type Person struct { Name string; Age int }
func (p Person) String() string {
return fmt.Sprintf("%s (%d)", p.Name, p.Age)
}
|
六、性能提示
Sprintf 有内存分配开销;频繁调用可考虑 strings.Builder + fmt.Fprintf。- 类型断言比
%v 反射更快,但对通用代码可接受。