Go中标准库fmt包的使用小结

 更新时间:2025年09月26日 09:27:20   作者:Jayden_念旧  
fmt包是Go语言处理输入输出的核心库,提供Print/Scan系列函数及多样格式化动词(如%v、%d、%s等),支持字符串格式化、扫描、自定义输出格式及错误处理,广泛用于数据格式化与输出控制,下面就来详细的介绍一下

fmt包是Go语言中用于格式化输入/输出的核心标准库,提供了丰富的函数来处理字符串格式化,打印和扫描。官方文档参考:pkg.go.dev/fmt

一、核心功能分类

1.输出函数(标准输出)

  • Print 系列:
    • Print(): 输出内容(无格式)
    • Println(): 输出内容并添加换行符
    • Printf(): 格式化输出(核心函数)
  // 使用 Print 函数,直接输出内容,不会自动换行
  fmt.Print("Hello, ")
  fmt.Print("World!\n")

  // 使用 Println 函数,输出内容后自动换行
  fmt.Println("This is a new line.")

  // 使用 Printf 函数,根据格式化字符串输出内容
  name := "Alice"
  age := 30
  fmt.Printf("My name is %s and I am %d years old.\n", name, age)

2.字符串格式化

  • Sprint 系列:返回格式化后的字符串
    • Sprintf(): 格式化并返回字符串
 // 使用 Sprint 函数,将参数格式化为字符串并返回
  str := fmt.Sprint("This is a ", "concatenated string.")
  fmt.Println(str)

  // 使用 Sprintln 函数,将参数格式化为字符串并返回,参数间用空格分隔,结尾添加换行符
  strLn := fmt.Sprintln("This", "is", "a", "Sprintln example.")
  fmt.Print(strLn)

  // 使用 Sprintf 函数,根据格式化字符串将参数格式化为字符串并返回
  formattedStr := fmt.Sprintf("The sum of %d and %d is %d.", 3, 5, 3+5)
  fmt.Println(formattedStr)

3. 输出到指定目标(io.Writer)

  • Fprint 系列:写入到文件/网络等
    • Fprintf(): 格式化并写入
// 使用 Fprint 函数,将内容输出到指定的 io.Writer,这里使用标准输出 os.Stdout
  // 一般用于将内容输出到文件等其他 io.Writer 中
  fmt.Fprint(os.Stdout, "Output using Fprint.\n")

  // 使用 Fprintln 函数,将内容输出到指定的 io.Writer 并换行
  fmt.Fprintln(os.Stdout, "Output using Fprintln.")

  // 使用 Fprintf 函数,根据格式化字符串将内容输出到指定的 io.Writer
  fmt.Fprintf(os.Stdout, "My name is %s and I am %d years old, using Fprintf.\n", name, age)

4. 输入扫描(标准输入/字符串/文件)

  • Scan 系列:
    • Scan(): 读取空格分隔的值
    • Scanf(): 格式化扫描(按模式解析)
   var name string
    var age int
    fmt.Scanf("%s %d", &name, &age) // 输入: "Bob 25"
  • Sscan(): 从字符串扫描
 input := "ID:100"
    var id int
    fmt.Sscan(input[4:], &id) // id = 100

二、格式化动词(Verbs)详情

格式化字符串使用%开头的动词指定数据类型:

1. 通用动词

  • %v:默认格式(自动推断类型)
  fmt.Printf("%v %v", "hello", 42) // "hello 42"
  • %+v:打印结构体时包含字段名
  fmt.Printf("%+v", User{Name: "Tom"}) // "{Name:Tom}"
  • %#v:Go语法表示
  fmt.Printf("%#v", "hi") // `"hi"`
  • %T:输出类型
  fmt.Printf("%T", 3.14) // "float64"

2. 整数类型

  • %d:十进制
  • %b:二进制
  • %x:十六进制(小写)
  • %o:八进制
  • %c:Unicode字符
  fmt.Printf("%d → %x → %c", 65, 65, 65) // "65 → 41 → A"

3. 浮点数

  • %f:小数形式(默认精度6)
  • %e:科学计数法(e小写)
  • %g:自动选择 %f 或 %e(更紧凑)
  fmt.Printf("%.2f | %e", 3.14159, 1000.0) // "3.14 | 1.000000e+03"

4. 字符串与字节切片

  • %s:直接输出字符串/字节切片
  • %q:带引号的转义字符串
  fmt.Printf("%q", "Go\t") // "\"Go\\t\""

5. 指针与地址

  • %p:指针地址
  x := 10
  fmt.Printf("%p", &x) // "0xc0000160d8"

三、高级格式控制

在动词前添加修饰符实现精细控制:

1.宽度与精度

  • %5d:最小宽度5(右对齐)
  • %-5d:左对齐
  • %05d:补零填充
  • %.3f:浮点数保留3位小数
  fmt.Printf("|%6s|%-6d|%06d|", "Hi", 42, 42)
  // 输出: |    Hi|42    |000042|

2. 自定义格式(实现接口)

若类型实现了 StringerFormatter 接口,可自定义输出:

type User struct{ Name string }
func (u User) String() string { return "[" + u.Name + "]" }

fmt.Print(User{"Alice"}) // 输出: [Alice]

四、错误处理

  • 所有函数返回写入字节数和错误(如扫描时类型不匹配):
 n, err := fmt.Printf("%d", "not-a-number")
  if err != nil {
      log.Fatal(err) // 报错: %!d(string=not-a-number)
  }

五、表格总结

输出函数

函数描述示例
Print()原样输出内容,不加换行符fmt.Print("Hello")
Println()输出内容并在末尾添加换行符fmt.Println("World")
Printf()格式化输出fmt.Printf("%d", 42)
Sprint()返回格式化后的字符串s := fmt.Sprint(42)
Fprint()将内容写入到io.Writer接口fmt.Fprint(w, "data")
Errorf()格式化错误信息fmt.Errorf("error")

输入函数

函数描述示例
Scan()从标准输入读取值fmt.Scan(&name)
Scanf()按格式从标准输入读取值fmt.Scanf("%s", &name)
Scanln()从标准输入读取一行fmt.Scanln(&name)
Sscan()从字符串中扫描值fmt.Sscan(str, &val)
Fscan()从io.Reader读取值fmt.Fscan(r, &val)

通用占位符

占位符描述示例
%v值的默认格式表示fmt.Printf("%v", data)
%+v添加字段名(结构体)fmt.Printf("%+v", user)
%#vGo语法表示fmt.Printf("%#v", arr)
%T值类型的Go表示fmt.Printf("%T", 42)
%%百分号字面量fmt.Printf("%%")

整数类型

占位符描述示例
%b二进制fmt.Printf("%b", 5) → 101
%d十进制fmt.Printf("%d", 42)
%o八进制fmt.Printf("%o", 8) → 10
%x十六进制(小写)fmt.Printf("%x", 255) → ff
%X十六进制(大写)fmt.Printf("%X", 255) → FF
%cUnicode码点对应字符fmt.Printf("%c", 65) → A
%UUnicode格式fmt.Printf("%U", 'A') → U+0041

浮点数和复数

占位符描述示例
%f浮点数(默认宽度、精度)fmt.Printf("%f", 3.14)
%e科学计数法(e)fmt.Printf("%e", 1000.0) → 1.000000e+03
%E科学计数法(E)fmt.Printf("%E", 1000.0) → 1.000000E+03
%g根据情况选择%e或%ffmt.Printf("%g", 10000000.0) → 1e+07
%G根据情况选择%E或%ffmt.Printf("%G", 10000000.0) → 1E+07

字符串和字节切片

占位符描述示例
%s字符串或切片fmt.Printf("%s", "hello")
%q双引号包裹的字符串fmt.Printf("%q", "hi") → "hi"
%x十六进制(小写)fmt.Printf("%x", "Go") → 476f
%X十六进制(大写)fmt.Printf("%X", "Go") → 476F

到此这篇关于Go中标准库fmt包的使用小结的文章就介绍到这了,更多相关Go fmt包内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • go xorm存库处理null值问题

    go xorm存库处理null值问题

    这篇文章主要介绍了go xorm存库处理null值问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • golang中的struct操作

    golang中的struct操作

    结构体是一种聚合的数据类型,是由零个或多个任意类型的值聚合成的实体,每个值称为结构体的成员。下面介绍下golang中的struct,感兴趣的朋友一起看看吧
    2021-11-11
  • go语言中值类型和指针类型的深入理解

    go语言中值类型和指针类型的深入理解

    这篇文章主要给大家介绍了关于go语言中值类型和指针类型的相关资料,文中通过实例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2022-03-03
  • go实现文件的创建、删除与读取示例代码

    go实现文件的创建、删除与读取示例代码

    这篇文章主要给大家介绍了关于go如何实现文件的创建、删除与读取的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起看看吧
    2019-02-02
  • go语言区块链学习调用智能合约

    go语言区块链学习调用智能合约

    这篇文章主要为大家介绍了go语言区块链学习中如何调用智能合约的实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2021-10-10
  • Hugo Config模块构建实现源码剖析

    Hugo Config模块构建实现源码剖析

    这篇文章主要为大家介绍了Hugo Config模块构建实现源码剖析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02
  • 深入理解Go语言中defer和panic的执行顺序

    深入理解Go语言中defer和panic的执行顺序

    defer 和 panic 的执行顺序是一个重要的概念,本文主要介绍了Go语言中defer和panic的执行顺序,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-05-05
  • Go调用opencv实现图片矫正的代码示例

    Go调用opencv实现图片矫正的代码示例

    这篇文章主要为大家详细介绍了Go调用opencv实现图片矫正的代码示例,文中的示例代码简洁易懂,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-09-09
  • Golang并发编程之调度器初始化详解

    Golang并发编程之调度器初始化详解

    这篇文章主要为大家详细介绍了Golang并发编程中关于调度器初始化的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下
    2023-03-03
  • Go实现生产随机密码的示例代码

    Go实现生产随机密码的示例代码

    这篇文章主要为大家详细介绍了如何利用Go实现生产随机密码的,文中的示例代码简洁易懂,具有一定的借鉴价值,有需要的小伙伴可以参考一下
    2023-09-09

最新评论