Go标准库深入学习:fmt包详解

Go标准库深入学习:fmt包详解

fmt包是Go语言中最基础也最常用的标准库之一,提供了格式化输入输出的功能。本文将深入解析fmt包的各种功能和使用方法。

fmt包概述

fmt包实现了类似C语言printf和scanf的格式化I/O。主要分为两大类函数:

  • Print类:输出到标准输出
  • Scan类:从标准输入读取

此外还包含:

  • Fprint:输出到指定io.Writer
  • Sprint:返回字符串而不输出
  • Errorf:格式化字符串创建错误

Print系列函数

fmt包提供了多种Print函数,每种都有不同的特点:

// 标准输出
fmt.Print()           // 无格式直接输出
fmt.Println()         // 输出后自动换行
fmt.Printf()          // 格式化输出

// 返回字符串
fmt.Sprint()          
fmt.Sprintln()
fmt.Sprintf()

// 输出到io.Writer
fmt.Fprint()          
fmt.Fprintln()
fmt.Fprintf()

格式化动词

Printf系列函数使用格式化动词来控制输出格式,常用动词包括:

  • %v:默认格式的值
  • %+v:打印结构体时会添加字段名
  • %#v:Go语法表示的值
  • %T:值的类型
  • %%:百分号本身
p := Person{"John", 25}
fmt.Printf("%v\n", p)    // {John 25}
fmt.Printf("%+v\n", p)   // {Name:John Age:25}
fmt.Printf("%#v\n", p)   // main.Person{Name:"John", Age:25}
fmt.Printf("%T\n", p)    // main.Person

宽度和精度控制

可以在动词中指定宽度和精度:

  • %nd:最小宽度n的十进制数,不足补空格
  • %+d:显示数值的正负号
  • %0nd:不足补零而非空格
  • %n.mf:宽度n,小数点后m位
fmt.Printf("|%5d|\n", 123)     // |  123|
fmt.Printf("|%05d|\n", 123)    // |00123|
fmt.Printf("|%-5d|\n", 123)    // |123  |
fmt.Printf("%.2f\n", 3.1415)   // 3.14

Scan系列函数

fmt包同样提供了多种Scan函数从标准输入读取:

var name string
var age int

// 从标准输入读取
fmt.Scan(&name, &age)          
fmt.Scanln(&name, &age)
fmt.Scanf("%s %d", &name, &age)

// 从字符串读取
fmt.Sscan(inputStr, &name, &age)

// 从io.Reader读取
fmt.Fscan(reader, &name, &age)

Stringer和GoStringer接口

fmt包会检查值是否实现了以下接口,实现自定义输出:

type Stringer interface {
    String() string
}

type GoStringer interface {
    GoString() string
}

如果类型实现了String()方法,%v/%s动词会调用该方法;实现了GoString()方法,#v动词会调用它。

Errorf函数

fmt.Errorf用于创建格式化的错误:

err := fmt.Errorf("invalid value %q", value)

使用技巧和注意事项

  1. Println会自动添加空格分隔参数,Print则不会:

    fmt.Print("a", "b")   // ab
    fmt.Println("a", "b") // a b
  2. Fprint系列函数可以输出到任意io.Writer:

    fmt.Fprintf(os.Stderr, "Error: %v\n", err)
  3. 格式化复杂数据结构时,考虑使用%+v或%#v:

    fmt.Printf("%+v\n", config)
  4. 处理用户输入时,Scan会识别空格分隔的值:

    fmt.Scan(&firstName, &lastName)
  5. 使用缓冲提高大批量输出性能:

    w := bufio.NewWriter(os.Stdout)
    fmt.Fprintln(w, "buffered output")
    w.Flush()

fmt包是Go语言中最常用的基础库之一,合理使用其格式化功能可以大大提高编码效率和代码可读性。

文末预告

下一期我们将深入探讨Go语言的os标准库,讲解文件和目录操作、环境变量处理、进程管理等核心功能。

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇