在Golang开发中,fmt包是处理格式化输入输出的基础工具,几乎所有需要控制台输出或者字符串格式化的场景都会用到它。下面我们就通过具体的使用示例来学习fmt包的常见用法。

fmt包核心输出函数
fmt包提供了多个输出相关的函数,不同函数的使用场景有所区别:
- Print:直接输出内容,多个参数之间不会自动添加空格,末尾也不会换行
- Println:输出内容后自动换行,多个参数之间会自动添加空格分隔
- Printf:支持格式化占位符,按照指定格式输出内容,不会自动换行
- Sprintf:和Printf功能类似,但是返回格式化后的字符串,不直接输出到控制台
常用格式化占位符
占位符是fmt包格式化输出的核心,不同类型的变量需要对应不同的占位符,常见的占位符如下:
| 占位符 | 适用类型 | 说明 |
|---|---|---|
| %v | 所有类型 | 默认格式输出,结构体输出时会包含字段名 |
| %+v | 结构体 | 输出结构体时会带上字段名 |
| %#v | 所有类型 | 输出Go语法表示的值 |
| %T | 所有类型 | 输出值对应的类型 |
| %d | 整数 | 十进制整数输出 |
| %f | 浮点数 | 十进制浮点数输出,默认保留6位小数 |
| %s | 字符串 | 直接输出字符串内容 |
| %p | 指针 | 输出指针的十六进制地址 |
完整使用示例
下面的代码覆盖了常见数据类型的格式化输出场景,可以直接运行查看效果:
package main
import (
"fmt"
)
func main() {
// 基础输出函数示例
fmt.Print("Print输出内容")
fmt.Println("Println输出内容")
fmt.Printf("Printf输出内容,不会自动换行")
// 变量定义
name := "张三"
age := 25
score := 92.5
isStudent := true
type Person struct {
Name string
Age int
}
p := Person{Name: "李四", Age: 30}
// 通用占位符示例
fmt.Printf("\n通用占位符示例:\n")
fmt.Printf("%%v 输出:name=%v, age=%v, score=%v, isStudent=%v, person=%v\n", name, age, score, isStudent, p)
fmt.Printf("%%+v 输出结构体:%+v\n", p)
fmt.Printf("%%#v 输出Go语法表示:%#v\n", p)
fmt.Printf("%%T 输出类型:name的类型是%T\n", name)
// 整数占位符示例
fmt.Printf("\n整数占位符示例:\n")
fmt.Printf("十进制输出:%d\n", age)
fmt.Printf("带宽度输出,不够补空格:%5d\n", age)
fmt.Printf("带宽度和0补位:%05d\n", age)
// 浮点数占位符示例
fmt.Printf("\n浮点数占位符示例:\n")
fmt.Printf("默认输出:%f\n", score)
fmt.Printf("保留2位小数:%.2f\n", score)
fmt.Printf("带宽度和小数位:%8.2f\n", score)
// 字符串和布尔值示例
fmt.Printf("\n字符串和布尔值示例:\n")
fmt.Printf("字符串输出:%s\n", name)
fmt.Printf("布尔值输出:%t\n", isStudent)
// 指针示例
fmt.Printf("\n指针示例:\n")
fmt.Printf("person指针地址:%p\n", &p)
// Sprintf示例,返回格式化字符串
info := fmt.Sprintf("姓名:%s,年龄:%d,分数:%.1f", name, age, score)
fmt.Printf("\nSprintf结果:%s\n", info)
}注意事项
使用fmt包格式化输出时需要注意几点:
- Printf类函数需要按照占位符的数量传入对应数量的参数,否则会触发运行时错误
- 浮点数格式化时,%.2f表示保留两位有效数字,不是四舍五入而是按照Go的默认舍入规则处理
- 如果需要输出百分号本身,需要使用两个百分号%%来表示,避免被识别为占位符
fmt包的占位符还有很多细分场景的用法,比如十六进制、八进制输出,或者结构体的递归输出等,开发者可以根据实际需求查阅官方文档扩展使用。