Go fmt包
Go标准库fmt实现格式化的输入输出操作。
Print系列函数
fmt.Print
Go
import "fmt"
// 基本输出
fmt.Print("Hello") // 输出:Hello
fmt.Print("Hello", "World") // 输出:HelloWorld
fmt.Print(42) // 输出:42
// 无格式,直接输出
fmt.Println
Go
// 输出并换行
fmt.Println("Hello") // 输出:Hello\n
fmt.Println("Hello", 42) // 输出:Hello 42\n
// 多个参数用空格分隔
fmt.Printf
Go
// 格式化输出
fmt.Printf("Name: %s\n", "Tom") // Name: Tom
fmt.Printf("Age: %d\n", 25) // Age: 25
fmt.Printf("Price: %.2f\n", 99.99) // Price: 99.99
// 使用格式动词
Print函数对比
| 函数 | 输出格式 | 示例 |
|---|---|---|
| 直接输出 | Print(a, b) → ab | |
| Println | 空格分隔+换行 | Println(a, b) → a b\n |
| Printf | 格式化输出 | Printf("%d", n) → n |
格式化动词
基本动词
Go
// 通用格式
fmt.Printf("%v", 42) // 42(默认格式)
fmt.Printf("%+v", user) // 输出字段名
fmt.Printf("%#v", user) // 输出Go语法表示
fmt.Printf("%T", 42) // int(类型)
// 整数格式
fmt.Printf("%d", 42) // 42(十进制)
fmt.Printf("%b", 42) // 101010(二进制)
fmt.Printf("%o", 42) // 52(八进制)
fmt.Printf("%x", 42) // 2a(十六进制小写)
fmt.Printf("%X", 42) // 2A(十六进制大写)
浮点数格式
Go
fmt.Printf("%f", 3.14) // 3.140000
fmt.Printf("%.2f", 3.14159) // 3.14(保留2位小数)
fmt.Printf("%e", 1234.5) // 1.234500e+03(科学计数法)
fmt.Printf("%E", 1234.5) // 1.234500E+03
fmt.Printf("%g", 3.14) // 3.14(紧凑格式)
字符串格式
Go
fmt.Printf("%s", "hello") // hello
fmt.Printf("%q", "hello") // "hello"(带引号)
fmt.Printf("%10s", "hi") // " hi"(宽度10)
fmt.Printf("%-10s", "hi") // "hi "(左对齐)
fmt.Printf("%.5s", "hello world") // hello(截断)
布尔格式
Go
fmt.Printf("%t", true) // true
fmt.Printf("%t", false) // false
指针格式
Go
fmt.Printf("%p", &x) // 0xc0000140a0(指针地址)
格式动词表
| 动词 | 含义 | 示例输出 |
|---|---|---|
| %v | 默认格式 | 42 |
| %d | 十进制整数 | 42 |
| %x | 十六进制 | 2a |
| %f | 浮点数 | 3.14 |
| %s | 字符串 | hello |
| %q | 带引号字符串 | "hello" |
| %t | 布尔值 | true |
| %T | 类型 | int |
| %p | 指针 | 0xc000... |
字符串格式化
fmt.Sprintf
Go
// 格式化并返回字符串
str := fmt.Sprintf("Name: %s, Age: %d", "Tom", 25)
fmt.Println(str) // Name: Tom, Age: 25
// 常用于构建字符串
msg := fmt.Sprintf("Error: %v", err)
fmt.Sprint/Sprintln
Go
// 返回字符串
str := fmt.Sprint("Hello", 42) // Hello42
str = fmt.Sprintln("Hello", 42) // Hello 42\n
写入到目标
fmt.Fprintf
Go
// 写入到io.Writer
fmt.Fprintf(os.Stdout, "Hello %s\n", "World")
// 写入到文件
file, _ := os.Create("output.txt")
fmt.Fprintf(file, "Data: %d\n", 42)
fmt.Fprint/Fprintln
Go
// 写入到Writer
fmt.Fprint(os.Stdout, "Hello")
fmt.Fprintln(os.Stdout, "Hello", 42)
错误格式化
fmt.Errorf
Go
// 创建格式化错误
err := fmt.Errorf("file not found: %s", filename)
// 包装错误
err = fmt.Errorf("process failed: %w", originalErr)
// %w包装错误用于errors.Is/As
Scan系列函数
fmt.Scan
Go
// 从标准输入读取
var name string
var age int
fmt.Scan(&name, &age)
// 输入:Tom 25
// name = "Tom", age = 25
fmt.Scanln
Go
// 读取到换行
var name string
var age int
fmt.Scanln(&name, &age)
// 输入:Tom 25(换行结束)
fmt.Scanf
Go
// 格式化读取
var name string
var age int
fmt.Scanf("%s %d", &name, &age)
// 输入:Tom 25
fmt.Sscan
Go
// 从字符串读取
var name string
var age int
fmt.Sscan("Tom 25", &name, &age)
// name = "Tom", age = 25
fmt.Sscanf
Go
// 从字符串格式化读取
var name string
var age int
fmt.Sscanf("Name:Tom Age:25", "Name:%s Age:%d", &name, &age)
Scan函数表
| 函数 | 来源 | 示例 |
|---|---|---|
| Scan | 标准输入 | Scan(&n) |
| Scanln | 标准输入(换行) | Scanln(&n) |
| Scanf | 格式化输入 | Scanf("%d", &n) |
| Sscan | 字符串 | Sscan("42", &n) |
| Sscanf | 格式化字符串 | Sscanf("%d", "42", &n) |
| Fscan | io.Reader | Fscan(file, &n) |
宽度与精度
格式控制
Go
// 宽度
fmt.Printf("%10d", 42) // " 42"
fmt.Printf("%-10d", 42) // "42 "
// 精度
fmt.Printf("%.2f", 3.14159) // 3.14
fmt.Printf("%.5s", "hello") // hello
// 宽度+精度
fmt.Printf("%10.2f", 3.14) // " 3.14"
要点总结
- Print直接输出,Println加空格换行
- Printf使用格式动词输出
- %v通用格式,%d整数,%s字符串
- Sprintf返回格式化字符串
- Fprintf写入到指定Writer
- Errorf创建格式化错误
- Scan从输入读取到变量
- 所有Scan必须传指针参数
- %w用于包装错误
- 宽度控制对齐,精度控制小数位
📝 发现内容有误?点击此处直接编辑