引入

写程序总要把结果输出到终端,或者从终端读取用户输入。Go 的 fmt 包就是干这件事的——格式化输入输出。不管是调试打印、日志输出还是读取用户输入,fmt 包都是用得最多的标准库之一。

正文

定义

定义

fmt 包提供格式化输入输出功能。输出函数把数据按指定格式打印到终端,输入函数从终端读取用户输入。格式化通过占位符(如 %d%s)控制数据的显示方式。

语法

import "fmt"
 
// 输出
fmt.Println("hello")                  // 打印并换行
fmt.Printf("age: %d\n", 20)          // 格式化打印
s := fmt.Sprintf("name: %s", "Tom")  // 格式化到字符串
 
// 输入
var name string
fmt.Scan(&name)  // 从终端读取一个值

例子

Println

fmt.Println("hello")           // hello
fmt.Println("a", "b", "c")    // a b c(自动加空格)
fmt.Println(1, 2, 3)           // 1 2 3

Println 自动在参数间加空格,末尾加换行符。适合快速调试输出。

Printf

fmt.Printf("名字: %s, 年龄: %d\n", "Tom", 20)
// 名字: Tom, 年龄: 20
 
fmt.Printf("价格: %.2f\n", 3.1415)
// 价格: 3.14
 
fmt.Printf("类型: %T\n", 42)
// 类型: int

Printf 不会自动换行,需要手动加 \n。通过占位符控制每个值的显示格式。

Sprintf

s := fmt.Sprintf("%s is %d years old", "Tom", 20)
fmt.Println(s) // Tom is 20 years old
 
msg := fmt.Sprintf("进度: %.1f%%", 75.5)
fmt.Println(msg) // 进度: 75.5%

SprintfPrintf 用法一样,区别是返回字符串而不是打印到终端。

Scan

var name string
var age int
 
fmt.Print("输入名字: ")
fmt.Scan(&name)
 
fmt.Print("输入年龄: ")
fmt.Scan(&age)
 
fmt.Printf("你好 %s,你 %d 岁了\n", name, age)

Scan 从终端读取输入,以空格或换行分隔。传的是变量指针(&),读到的值直接写入变量。

常用占位符

fmt.Printf("%d\n", 42)        // 42(十进制整数)
fmt.Printf("%b\n", 42)        // 101010(二进制)
fmt.Printf("%x\n", 255)       // ff(十六进制)
fmt.Printf("%f\n", 3.14)      // 3.140000(浮点数)
fmt.Printf("%.2f\n", 3.1415)  // 3.14(保留两位小数)
fmt.Printf("%s\n", "hello")   // hello(字符串)
fmt.Printf("%q\n", "hello")   // "hello"(带引号的字符串)
fmt.Printf("%v\n", 42)        // 42(默认格式)
fmt.Printf("%+v\n", person)   // 带字段名的结构体
fmt.Printf("%T\n", 42)        // int(类型)
fmt.Printf("%p\n", &x)        // 0xc0000...(指针地址)

常见写法

函数/占位符说明
fmt.Println(a, b)打印并换行,参数间自动加空格
fmt.Printf("%d", v)格式化打印,不自动换行
fmt.Sprintf("%s", v)格式化到字符串
fmt.Scan(&v)从终端读取一个值
fmt.Scanf("%d", &v)按格式从终端读取
fmt.Sscanf(s, "%d", &v)按格式从字符串读取
%d十进制整数
%f / %.2f浮点数 / 保留小数位
%s字符串
%v默认格式
%T值的类型
%q带引号的字符串
%x十六进制
%+v结构体带字段名

特点

  • Println 自动换行加空格,Printf 不自动换行,需要手动 \n
  • Sprintf 返回字符串,不打印到终端,适合拼接格式化文本
  • Scan 传的是指针,用 & 取地址
  • %v 是万能占位符,能打印任何类型的默认格式
  • %+v 打印结构体时带字段名,调试时特别有用
  • %T 能打印值的类型信息,排查类型问题很方便
  • fmt.Errorf() 用格式化字符串创建错误值,在 Go 错误处理 里常用

理解

fmt 包就是 Go 的”打印工具箱”。日常调试用 Println 最省事,需要控制格式用 Printf + 占位符,要拼字符串用 Sprintf。占位符记住几个常用的就够了:%d 整数、%f 浮点、%s 字符串、%v 万能、%T 看类型。Scan 系列用得相对少,大部分时候输入来自文件或网络而不是终端。

引出

Sprintf 能格式化输出,但如果要对字符串本身做查找、替换、分割等操作,就需要专门的字符串处理工具。接下来看 Go strings 包,学习 strings 包里的字符串操作函数。