Go标准库深入学习:fmt包详解
fmt包是Go语言中最基础也最常用的标准库之一,提供了格式化输入输出的功能。本文将深入解析fmt包的各种功能和使用方法。
fmt包概述
fmt包实现了类似C语言printf和scanf的格式化I/O。主要分为两大类函数:
- Print类:输出到标准输出
- Scan类:从标准输入读取
此外还包含:
- Fprint:输出到指定io.Writer
- Sprint:返回字符串而不输出
- Errorf:格式化字符串创建错误
Print系列函数
fmt包提供了多种Print函数,每种都有不同的特点:
// 标准输出
fmt.Print() // 无格式直接输出
fmt.Println() // 输出后自动换行
fmt.Printf() // 格式化输出
// 返回字符串
fmt.Sprint()
fmt.Sprintln()
fmt.Sprintf()
// 输出到io.Writer
fmt.Fprint()
fmt.Fprintln()
fmt.Fprintf()
格式化动词
Printf系列函数使用格式化动词来控制输出格式,常用动词包括:
%v
:默认格式的值%+v
:打印结构体时会添加字段名%#v
:Go语法表示的值%T
:值的类型%%
:百分号本身
p := Person{"John", 25}
fmt.Printf("%v\n", p) // {John 25}
fmt.Printf("%+v\n", p) // {Name:John Age:25}
fmt.Printf("%#v\n", p) // main.Person{Name:"John", Age:25}
fmt.Printf("%T\n", p) // main.Person
宽度和精度控制
可以在动词中指定宽度和精度:
%nd
:最小宽度n的十进制数,不足补空格%+d
:显示数值的正负号%0nd
:不足补零而非空格%n.mf
:宽度n,小数点后m位
fmt.Printf("|%5d|\n", 123) // | 123|
fmt.Printf("|%05d|\n", 123) // |00123|
fmt.Printf("|%-5d|\n", 123) // |123 |
fmt.Printf("%.2f\n", 3.1415) // 3.14
Scan系列函数
fmt包同样提供了多种Scan函数从标准输入读取:
var name string
var age int
// 从标准输入读取
fmt.Scan(&name, &age)
fmt.Scanln(&name, &age)
fmt.Scanf("%s %d", &name, &age)
// 从字符串读取
fmt.Sscan(inputStr, &name, &age)
// 从io.Reader读取
fmt.Fscan(reader, &name, &age)
Stringer和GoStringer接口
fmt包会检查值是否实现了以下接口,实现自定义输出:
type Stringer interface {
String() string
}
type GoStringer interface {
GoString() string
}
如果类型实现了String()方法,%v/%s动词会调用该方法;实现了GoString()方法,#v动词会调用它。
Errorf函数
fmt.Errorf用于创建格式化的错误:
err := fmt.Errorf("invalid value %q", value)
使用技巧和注意事项
-
Println会自动添加空格分隔参数,Print则不会:
fmt.Print("a", "b") // ab fmt.Println("a", "b") // a b
-
Fprint系列函数可以输出到任意io.Writer:
fmt.Fprintf(os.Stderr, "Error: %v\n", err)
-
格式化复杂数据结构时,考虑使用%+v或%#v:
fmt.Printf("%+v\n", config)
-
处理用户输入时,Scan会识别空格分隔的值:
fmt.Scan(&firstName, &lastName)
-
使用缓冲提高大批量输出性能:
w := bufio.NewWriter(os.Stdout) fmt.Fprintln(w, "buffered output") w.Flush()
fmt包是Go语言中最常用的基础库之一,合理使用其格式化功能可以大大提高编码效率和代码可读性。
文末预告
下一期我们将深入探讨Go语言的os
标准库,讲解文件和目录操作、环境变量处理、进程管理等核心功能。