全部学科
Python全栈
python
NodeJS全栈
nodejs
小程序首页
📅 2026-05-14 5 分钟 ✍️ juanwangdev

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直接输出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)
Fscanio.ReaderFscan(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用于包装错误
  • 宽度控制对齐,精度控制小数位

📝 发现内容有误?点击此处直接编辑

← 上一篇 Go flag包
下一篇 → Go http包
想查看更多题目和详细解析?
小程序提供完整的题库、模拟考试和详细解析
马上就来

长按或扫描二维码,立即体验

扫码体验小程序
马上就来
使用微信扫描二维码
立即体验完整题库