Go 字符串格式化详解📘

Go 字符串格式化详解(String Formatting)

一、核心重点(快速掌握)

序号 重点内容 备注说明
1 使用 fmt.Sprintf 构造格式化字符串 最常用函数之一,适用于日志、调试输出等
2 支持多种动词(verb)格式 %d, %s, %v, %T
3 动词支持宽度、精度、对齐控制 可指定最小字段宽度、浮点数精度、左对齐等
4 格式化布尔值、整数、浮点数、字符串、结构体等 全面覆盖基本类型和复合类型
5 使用 %v%+v 输出结构体详情 %+v 显示字段名
6 %#v 显示 Go 语法表示 用于调试,显示变量的完整 Go 表达式
7 浮点数可控制小数位数 使用 %.2f 控制精度
8 支持占位符复用 使用 `[数字]
------ -------------------------------------- --------------------------------------------------------------------------
1 使用 fmt.Sprintf 构造格式化字符串 最常用函数之一,适用于日志、调试输出等
2 支持多种动词(verb)格式 %d, %s, %v, %T
3 动词支持宽度、精度、对齐控制 可指定最小字段宽度、浮点数精度、左对齐等
4 格式化布尔值、整数、浮点数、字符串、结构体等 全面覆盖基本类型和复合类型
5 使用 %v%+v 输出结构体详情 %+v 显示字段名
6 %#v 显示 Go 语法表示 用于调试,显示变量的完整 Go 表达式
7 浮点数可控制小数位数 使用 %.2f 控制精度
指定参数顺序,避免重复传参

二、知识点详解(专题深入)

1、格式化函数概述

Go 提供了多个格式化字符串的函数,最常用的是:

  • fmt.Sprintf(format string, a ...interface{}) string
  • fmt.Printf(format string, a ...interface{})
  • fmt.Fprintf(w io.Writer, format string, a ...interface{})

注意点

  • 所有格式化操作都依赖一个格式字符串(format string)和一组参数。
  • 参数可以是任意类型,Go 会自动根据动词解析。

2、格式化动词(Format Verbs)

以下是 Go 中所有常用的格式化动词及其用途说明:

动词 类型/含义描述
%v 默认格式输出任意值。对于结构体仅输出字段值
%+v 输出结构体时带字段名
%#v 输出 Go 语法形式的值(如结构体字面量)
%T 输出值的类型信息
%% 输出一个 % 符号本身
%t 布尔值:truefalse
%d 十进制整数(signed)
%b 二进制整数
%o 八进制整数
%x 小写十六进制整数
%X 大写十六进制整数
%U Unicode 码点(如 U+263A)
%c Unicode 码点对应的字符
%q 带引号的字符串或字符(适合转义)
%s 字符串或 []byte
%p 指针地址(以十六进制表示)
%e 科学计数法(小写 e)
%E 科学计数法(大写 E)
%f 浮点数(默认六位小数)
%g 自动选择 %e%f,去除无意义的零
%G %g,但使用大写 E
%x(用于浮点数) 十六进制浮点数
%X(用于浮点数) 十六进制浮点数(大写)

3、格式化选项详解(Width、Precision、Flags)

宽度(Width)

格式:%[width]v

fmt.Sprintf("%10s", "hello") // 输出: "     hello"(右对齐)

精度(Precision)

格式:%.[precision]v

fmt.Sprintf("%.2f", 3.14159) // 输出: "3.14"

对齐方式(Left Align)

格式:%-[width]v

fmt.Sprintf("%-10s", "hello") // 输出: "hello     "(左对齐)

正负号(Sign)

格式:%+[number]v

fmt.Sprintf("%+d", 123)  // 输出: "+123"
fmt.Sprintf("% d", -123) // 输出: "-123"

零填充(Zero Padding)

格式:%0[width]v

fmt.Sprintf("%05d", 12) // 输出: "00012"

占位符复用(Index)

格式:[index]$

fmt.Sprintf("%[2]d + %[1]d = %[3]d", 1, 2, 3) // 输出: "2 + 1 = 3"

4、实例演示与横向比对

示例 1:基本数据类型格式化

package main

import (
	"fmt"
)

func main() {
	fmt.Println("布尔值:", fmt.Sprintf("%t", true))       // 输出: 布尔值: true
	fmt.Println("十进制:", fmt.Sprintf("%d", 123))        // 输出: 十进制: 123
	fmt.Println("二进制:", fmt.Sprintf("%b", 123))        // 输出: 二进制: 1111011
	fmt.Println("八进制:", fmt.Sprintf("%o", 123))        // 输出: 八进制: 173
	fmt.Println("十六进制:", fmt.Sprintf("%x", 123))      // 输出: 十六进制: 7b
	fmt.Println("Unicode码点:", fmt.Sprintf("%U", '中'))  // 输出: U+4E2D
	fmt.Println("字符:", fmt.Sprintf("%c", '中'))         // 输出: 中
	fmt.Println("字符串:", fmt.Sprintf("%s", "你好"))     // 输出: 你好
	fmt.Println("指针地址:", fmt.Sprintf("%p", &main))    // 输出: 0x...
}

示例 2:结构体格式化

type Person struct {
	Name string
	Age  int
}

p := Person{"Alice", 25}

fmt.Println("默认格式:", fmt.Sprintf("%v", p))     // 输出: {Alice 25}
fmt.Println("带字段名:", fmt.Sprintf("%+v", p))    // 输出: {Name:Alice Age:25}
fmt.Println("Go语法:", fmt.Sprintf("%#v", p))      // 输出: main.Person{Name:"Alice", Age:25}

示例 3:浮点数格式化

f := 123.456789

fmt.Println("默认浮点:", fmt.Sprintf("%f", f))          // 输出: 123.456789
fmt.Println("保留两位小数:", fmt.Sprintf("%.2f", f))    // 输出: 123.46
fmt.Println("科学记数法:", fmt.Sprintf("%e", f))        // 输出: 1.234568e+02
fmt.Println("自动选择:", fmt.Sprintf("%g", f))          // 输出: 123.457

示例 4:复杂格式组合

name := "Bob"
score := 98.76

result := fmt.Sprintf("姓名:%10s | 成绩:%6.2f", name, score)
fmt.Println(result)
// 输出: 姓名:       Bob | 成绩: 98.76

5、多语言横向比对:格式化差异

特性/语言 Go Python Java C/C++
格式化函数 fmt.Sprintf str.format() / f-string String.format() sprintf()
默认格式 %v {} %s %d, %s
结构体输出 %+v, %#v __repr__, __str__ toString() 不直接支持结构体
浮点数精度控制 %.2f :.2f %.2f %.2f
左对齐控制 %-10s <10 -10 %-10s
零填充 %05d 0>5 05d %05d
指针地址输出 %p id(x) System.identityHashCode() %p
占位符复用 `[1] 特性/语言 Go Python
---------------- ------------------------------ -------------------------------- ------------------------------- ----------------------------
格式化函数 fmt.Sprintf str.format() / f-string String.format() sprintf()
默认格式 %v {} %s %d, %s
结构体输出 %+v, %#v __repr__, __str__ toString() 不直接支持结构体
浮点数精度控制 %.2f :.2f %.2f %.2f
左对齐控制 %-10s <10 -10 %-10s
零填充 %05d 0>5 05d %05d
指针地址输出 %p id(x) System.identityHashCode() %p
                   \| `{0}`                         \| `%1$d`                       | 不支持                     |

✅ 总结

本章系统讲解了 Go 语言中字符串格式化的全部动词和格式化选项,涵盖以下内容:

  • 格式化函数家族(Sprintf、Printf、Fprintf)
  • 所有格式化动词(%v、%s、%d、%f、%t、%p、%T、%#v、%+v 等)
  • 格式化选项(宽度、精度、对齐、符号、零填充等)
  • 实例代码展示各类格式化技巧
  • 多语言横向比对(Go vs Python、Java、C/C++)
  • 注意事项与最佳实践(如结构体打印、浮点数精度处理等)

掌握这些格式化动词和技巧,将极大提升你在日志记录、调试输出、数据展示等方面的开发效率。

如需继续学习数组、切片、映射等结构,请继续提问。

posted @ 2025-06-25 07:48  红尘过客2022  阅读(95)  评论(0)    收藏  举报