在 Go 语言开发中,最常使用的标准库之一就是
fmt。无论是调试程序、打印日志、构建字符串,还是格式化输出数据,fmt都扮演着非常重要的角色。fmt的名字来源于 format(格式化),它主要用于实现格式化输入与输出功能。通过fmt,开发者可以非常方便地把变量内容打印到终端、构建字符串、或者按照指定格式输出数据。
Go 的设计理念强调简单与统一,因此 fmt 的 API 设计非常清晰,常见函数包括 Print、Println、Printf、Sprintf、Scan 等。理解这些函数的区别和使用方式,可以让日常开发效率大大提升。
最基础的输出函数是 fmt.Print()。它会把内容直接输出到标准输出(通常是终端),不会自动添加换行符。如果需要连续输出多个变量,可以把它们作为参数传入。
package main
import "fmt"
func main() {
fmt.Print("Hello ")
fmt.Print("Go")
}
运行后终端输出:
Hello Go
与 Print 类似的函数是 fmt.Println(),区别在于它会在输出内容后自动添加换行符,并且多个参数之间会自动加空格。这也是开发中最常用的打印方式。
package main
import "fmt"
func main() {
fmt.Println("Hello", "Go")
}
输出结果:
Hello Go
如果需要更灵活的输出控制,例如指定变量类型或格式,就需要使用 fmt.Printf()。这个函数支持格式化字符串,类似 C 语言中的 printf。通过格式化占位符,可以控制变量的输出形式。
package main
import "fmt"
func main() {
name := "Alice"
age := 25
fmt.Printf("name: %s age: %d\n", name, age)
}
输出结果:
name: Alice age: 25
Printf 的核心是格式化占位符,不同占位符代表不同类型。最常用的包括:
%s 字符串
%d 十进制整数
%f 浮点数
%t 布尔值
%v 默认格式
%T 变量类型
例如:
num := 100
fmt.Printf("value: %v type: %T\n", num, num)
输出:
value: 100 type: int
在实际开发中,%v 是非常常见的占位符,它会自动使用默认格式输出变量内容。如果需要更详细的信息,可以使用 %+v 或 %#v。%+v 会显示结构体字段名称,而 %#v 会输出 Go 语法格式的结构体。
type User struct {
Name string
Age int
}
u := User{"Tom", 30}
fmt.Printf("%v\n", u)
fmt.Printf("%+v\n", u)
fmt.Printf("%#v\n", u)
输出示例:
{Tom 30}
{Name:Tom Age:30}
main.User{Name:"Tom", Age:30}
除了直接输出到终端,fmt 还可以把格式化内容生成字符串。例如 fmt.Sprintf()。这个函数不会打印内容,而是返回一个字符串。它在构建日志内容、生成 SQL 语句、构造 URL 或 JSON 字符串时非常实用。
name := "Bob"
age := 20
msg := fmt.Sprintf("name=%s age=%d", name, age)
fmt.Println(msg)
输出:
name=Bob age=20
如果需要把格式化结果写入 io.Writer,例如文件或网络连接,可以使用 fmt.Fprintf()。
file, _ := os.Create("log.txt")
fmt.Fprintf(file, "log: %s\n", "system start")
这样输出内容就会写入文件,而不是终端。
除了输出功能,fmt 还提供了输入读取功能。例如 fmt.Scan() 可以从标准输入读取数据。这个函数常用于简单的 CLI 程序。
var name string
fmt.Scan(&name)
fmt.Println("hello", name)
用户在终端输入:
Alice
程序输出:
hello Alice
如果需要按行读取输入,可以使用 fmt.Scanln()。
var name string
fmt.Scanln(&name)
而 fmt.Scanf() 则支持按照指定格式读取输入,例如:
var name string
var age int
fmt.Scanf("%s %d", &name, &age)
用户输入:
Tom 18
程序就会分别解析两个变量。
在调试程序时,fmt 还有一个非常实用的技巧,就是快速打印变量状态。例如:
fmt.Printf("value=%v\n", value)
或者:
fmt.Println("debug:", value)
在很多 Go 项目中,开发者都会用 fmt 进行临时调试输出。
fmt 还支持宽度和精度控制。例如格式化浮点数保留两位小数:
price := 19.999
fmt.Printf("%.2f\n", price)
输出:
20.00
也可以控制输出宽度:
fmt.Printf("%10d\n", 100)
输出会占 10 个字符宽度:
100
如果在宽度前加 -,则表示左对齐:
fmt.Printf("%-10d\n", 100)
输出:
100
这种功能在构建表格输出或 CLI 工具时非常有用。
在实际项目中,fmt 的使用场景非常广泛。例如在 Web 服务中构建日志信息,在 CLI 工具中打印执行结果,在数据处理程序中生成格式化文本,或者在调试阶段输出变量状态。几乎每一个 Go 程序都会使用 fmt。
从整体来看,fmt 的核心能力可以总结为三类:第一类是输出函数,例如 Print、Println、Printf;第二类是字符串构建函数,例如 Sprintf;第三类是输入解析函数,例如 Scan、Scanln、Scanf。这些函数共同构成了 Go 最基础的输入输出工具体系。
掌握 fmt 不仅能够提高代码的可读性,还可以让程序输出更加清晰、规范。在 Go 的标准库中,fmt 虽然看起来简单,但却是几乎所有程序都会依赖的基础组件。对于每一个 Go 开发者来说,熟练使用 fmt 是编写高质量代码的重要基础。