Go中标准库fmt包的使用小结
作者:Jayden_念旧
fmt包是Go语言处理输入输出的核心库,提供Print/Scan系列函数及多样格式化动词(如%v、%d、%s等),支持字符串格式化、扫描、自定义输出格式及错误处理,广泛用于数据格式化与输出控制,下面就来详细的介绍一下
fmt包是Go语言中用于格式化输入/输出的核心标准库,提供了丰富的函数来处理字符串格式化,打印和扫描。官方文档参考:pkg.go.dev/fmt
一、核心功能分类
1.输出函数(标准输出)
- Print 系列:
- Print(): 输出内容(无格式)
- Println(): 输出内容并添加换行符
- Printf(): 格式化输出(核心函数)
// 使用 Print 函数,直接输出内容,不会自动换行
fmt.Print("Hello, ")
fmt.Print("World!\n")
// 使用 Println 函数,输出内容后自动换行
fmt.Println("This is a new line.")
// 使用 Printf 函数,根据格式化字符串输出内容
name := "Alice"
age := 30
fmt.Printf("My name is %s and I am %d years old.\n", name, age)2.字符串格式化
- Sprint 系列:返回格式化后的字符串
- Sprintf(): 格式化并返回字符串
// 使用 Sprint 函数,将参数格式化为字符串并返回
str := fmt.Sprint("This is a ", "concatenated string.")
fmt.Println(str)
// 使用 Sprintln 函数,将参数格式化为字符串并返回,参数间用空格分隔,结尾添加换行符
strLn := fmt.Sprintln("This", "is", "a", "Sprintln example.")
fmt.Print(strLn)
// 使用 Sprintf 函数,根据格式化字符串将参数格式化为字符串并返回
formattedStr := fmt.Sprintf("The sum of %d and %d is %d.", 3, 5, 3+5)
fmt.Println(formattedStr)3. 输出到指定目标(io.Writer)
- Fprint 系列:写入到文件/网络等
- Fprintf(): 格式化并写入
// 使用 Fprint 函数,将内容输出到指定的 io.Writer,这里使用标准输出 os.Stdout // 一般用于将内容输出到文件等其他 io.Writer 中 fmt.Fprint(os.Stdout, "Output using Fprint.\n") // 使用 Fprintln 函数,将内容输出到指定的 io.Writer 并换行 fmt.Fprintln(os.Stdout, "Output using Fprintln.") // 使用 Fprintf 函数,根据格式化字符串将内容输出到指定的 io.Writer fmt.Fprintf(os.Stdout, "My name is %s and I am %d years old, using Fprintf.\n", name, age)
4. 输入扫描(标准输入/字符串/文件)
- Scan 系列:
- Scan(): 读取空格分隔的值
- Scanf(): 格式化扫描(按模式解析)
var name string
var age int
fmt.Scanf("%s %d", &name, &age) // 输入: "Bob 25"- Sscan(): 从字符串扫描
input := "ID:100"
var id int
fmt.Sscan(input[4:], &id) // id = 100二、格式化动词(Verbs)详情
格式化字符串使用%开头的动词指定数据类型:
1. 通用动词
%v:默认格式(自动推断类型)
fmt.Printf("%v %v", "hello", 42) // "hello 42"%+v:打印结构体时包含字段名
fmt.Printf("%+v", User{Name: "Tom"}) // "{Name:Tom}"%#v:Go语法表示
fmt.Printf("%#v", "hi") // `"hi"`%T:输出类型
fmt.Printf("%T", 3.14) // "float64"2. 整数类型
- %d:十进制
- %b:二进制
- %x:十六进制(小写)
- %o:八进制
- %c:Unicode字符
fmt.Printf("%d → %x → %c", 65, 65, 65) // "65 → 41 → A"3. 浮点数
- %f:小数形式(默认精度6)
- %e:科学计数法(e小写)
- %g:自动选择 %f 或 %e(更紧凑)
fmt.Printf("%.2f | %e", 3.14159, 1000.0) // "3.14 | 1.000000e+03"4. 字符串与字节切片
- %s:直接输出字符串/字节切片
- %q:带引号的转义字符串
fmt.Printf("%q", "Go\t") // "\"Go\\t\""5. 指针与地址
- %p:指针地址
x := 10
fmt.Printf("%p", &x) // "0xc0000160d8"三、高级格式控制
在动词前添加修饰符实现精细控制:
1.宽度与精度
- %5d:最小宽度5(右对齐)
- %-5d:左对齐
- %05d:补零填充
- %.3f:浮点数保留3位小数
fmt.Printf("|%6s|%-6d|%06d|", "Hi", 42, 42)
// 输出: | Hi|42 |000042|2. 自定义格式(实现接口)
若类型实现了 Stringer 或 Formatter 接口,可自定义输出:
type User struct{ Name string }
func (u User) String() string { return "[" + u.Name + "]" }
fmt.Print(User{"Alice"}) // 输出: [Alice]四、错误处理
- 所有函数返回写入字节数和错误(如扫描时类型不匹配):
n, err := fmt.Printf("%d", "not-a-number")
if err != nil {
log.Fatal(err) // 报错: %!d(string=not-a-number)
}五、表格总结
输出函数
| 函数 | 描述 | 示例 |
|---|---|---|
| Print() | 原样输出内容,不加换行符 | fmt.Print("Hello") |
| Println() | 输出内容并在末尾添加换行符 | fmt.Println("World") |
| Printf() | 格式化输出 | fmt.Printf("%d", 42) |
| Sprint() | 返回格式化后的字符串 | s := fmt.Sprint(42) |
| Fprint() | 将内容写入到io.Writer接口 | fmt.Fprint(w, "data") |
| Errorf() | 格式化错误信息 | fmt.Errorf("error") |
输入函数
| 函数 | 描述 | 示例 |
|---|---|---|
| Scan() | 从标准输入读取值 | fmt.Scan(&name) |
| Scanf() | 按格式从标准输入读取值 | fmt.Scanf("%s", &name) |
| Scanln() | 从标准输入读取一行 | fmt.Scanln(&name) |
| Sscan() | 从字符串中扫描值 | fmt.Sscan(str, &val) |
| Fscan() | 从io.Reader读取值 | fmt.Fscan(r, &val) |
通用占位符
| 占位符 | 描述 | 示例 |
|---|---|---|
| %v | 值的默认格式表示 | fmt.Printf("%v", data) |
| %+v | 添加字段名(结构体) | fmt.Printf("%+v", user) |
| %#v | Go语法表示 | fmt.Printf("%#v", arr) |
| %T | 值类型的Go表示 | fmt.Printf("%T", 42) |
| %% | 百分号字面量 | fmt.Printf("%%") |
整数类型
| 占位符 | 描述 | 示例 |
|---|---|---|
| %b | 二进制 | fmt.Printf("%b", 5) → 101 |
| %d | 十进制 | fmt.Printf("%d", 42) |
| %o | 八进制 | fmt.Printf("%o", 8) → 10 |
| %x | 十六进制(小写) | fmt.Printf("%x", 255) → ff |
| %X | 十六进制(大写) | fmt.Printf("%X", 255) → FF |
| %c | Unicode码点对应字符 | fmt.Printf("%c", 65) → A |
| %U | Unicode格式 | fmt.Printf("%U", 'A') → U+0041 |
浮点数和复数
| 占位符 | 描述 | 示例 |
|---|---|---|
| %f | 浮点数(默认宽度、精度) | fmt.Printf("%f", 3.14) |
| %e | 科学计数法(e) | fmt.Printf("%e", 1000.0) → 1.000000e+03 |
| %E | 科学计数法(E) | fmt.Printf("%E", 1000.0) → 1.000000E+03 |
| %g | 根据情况选择%e或%f | fmt.Printf("%g", 10000000.0) → 1e+07 |
| %G | 根据情况选择%E或%f | fmt.Printf("%G", 10000000.0) → 1E+07 |
字符串和字节切片
| 占位符 | 描述 | 示例 |
|---|---|---|
| %s | 字符串或切片 | fmt.Printf("%s", "hello") |
| %q | 双引号包裹的字符串 | fmt.Printf("%q", "hi") → "hi" |
| %x | 十六进制(小写) | fmt.Printf("%x", "Go") → 476f |
| %X | 十六进制(大写) | fmt.Printf("%X", "Go") → 476F |
到此这篇关于Go中标准库fmt包的使用小结的文章就介绍到这了,更多相关Go fmt包内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
