Go标准库深入学习:fmt包
fmt包是Go语言中最基础和常用的标准库之一,提供了格式化输入输出的功能。本文将深入探讨fmt包的各种用法和特性。
基本输出函数
fmt包提供了三个主要的输出函数:
func Print(a ...interface{}) (n int, err error) // 输出到标准输出,不换行
func Println(a ...interface{}) (n int, err error) // 输出到标准输出并换行
func Printf(format string, a ...interface{}) (n int, err error) // 格式化输出
格式化输出
Printf函数使用格式化动词(verbs)指定输出格式:
package main
import "fmt"
func main() {
// 基本格式化
fmt.Printf("Hello %s\n", "World") // 字符串
fmt.Printf("%d\n", 123) // 整数
fmt.Printf("%f\n", 78.9) // 浮点数
// 特殊格式化
fmt.Printf("%t\n", true) // 布尔值
fmt.Printf("%p\n", &struct{}{}) // 指针
fmt.Printf("%c\n", 65) // Unicode编码对应的字符
}
常用格式化动词
动词 | 说明 |
---|---|
%v | 值的默认格式 |
%+v | 类似%v,但输出结构体时会添加字段名 |
%#v | Go语法表示的值 |
%T | 值的类型的Go语法表示 |
%% | 百分号 |
输入函数
fmt包也提供了输入函数:
func Scan(a ...interface{}) (n int, err error) // 从标准输入读取
func Scanf(format string, a ...interface{}) (n int, err error) // 格式化读取
func Scanln(a ...interface{}) (n int, err error) // 类似Scan,但遇到换行停止
字符串格式化
除了输出到标准输出,fmt包还可以格式化字符串到变量:
func Sprintf(format string, a ...interface{}) string // 返回格式化字符串
func Sprint(a ...interface{}) string // 返回连接后的字符串
func Sprintln(a ...interface{}) string // 返回连接后的字符串并添加换行符
错误格式化
fmt包提供了创建格式化错误信息的便利函数:
func Errorf(format string, a ...interface{}) error
示例代码
package main
import (
"fmt"
"os"
)
type Point struct {
X, Y int
}
func main() {
p := Point{1, 2}
// 不同的格式化输出
fmt.Printf("%v\n", p) // {1 2}
fmt.Printf("%+v\n", p) // {X:1 Y:2}
fmt.Printf("%#v\n", p) // main.Point{X:1, Y:2}
// 字符串格式化
s := fmt.Sprintf("a %s", "string")
fmt.Println(s)
// 格式化的错误
err := fmt.Errorf("an %s", "error")
fmt.Println(err)
// 写入到io.Writer
fmt.Fprintf(os.Stderr, "an %s\n", "error")
}
高级用法
宽度和精度控制
fmt.Printf("|%6d|%6d|\n", 12, 345) // | 12| 345|
fmt.Printf("|%6.2f|%6.2f|\n", 1.2, 3.45) // | 1.20| 3.45|
fmt.Printf("|%-6.2f|%-6.2f|\n", 1.2, 3.45) // |1.20 |3.45 |
自定义类型的格式化
可以通过实现fmt包中的接口来自定义类型的格式化输出:
type Person struct {
Name string
Age int
}
func (p Person) String() string {
return fmt.Sprintf("%v (%v years)", p.Name, p.Age)
}
func main() {
a := Person{"Arthur Dent", 42}
fmt.Println(a) // Arthur Dent (42 years)
}
性能考虑
当需要高性能的字符串拼接时,fmt.Sprintf可能不是最佳选择,可以考虑使用strings.Builder或bytes.Buffer。
总结
fmt包提供了强大的格式化输入输出功能,是Go编程中不可或缺的部分。掌握fmt包的各种格式化和输入输出方法,可以大大提高开发效率。
文末预告:Go标准库深入学习:strings包