fmt

fmt.Sprintf、fmt.Fprintf 和 fmt.Printf 都是 Go 语言 fmt 包中的函数,用于格式化和输出字符串。它们的主要区别在于输出的目标不同。

fmt.Printf

定义与用途

  • 定义: func Printf(format string, a ...interface{}) (n int, err error)
  • 用途: 格式化字符串并将结果直接输出到标准输出(通常是控制台)。

主要特点

  • 返回值:
    • n: 写入的字节数。
    • err: 可能发生的错误。
  • 参数:
    • format: 一个格式字符串,包含格式动词(如 %d, %s, %v 等),指定如何格式化后续参数。
    • a …interface{}: 可变参数列表,是需要格式化的值。

示例

  1. go
  2. 复制代码
  3. package main
  4. import (
  5. "fmt"
  6. )
  7. func main() {
  8. name := "Charlie"
  9. age := 28
  10. fmt.Printf("Name: %s, Age: %d\n", name, age)
  11. }
  • 输出:
  1. yaml
  2. 复制代码
  3. Name: Charlie, Age: 28

在这个示例中,fmt.Printf 将格式化后的字符串直接输出到标准输出(控制台)。

fmt.Sprintf

定义与用途

  • 定义: func Sprintf(format string, a …interface{}) string
  • 用途: 格式化字符串并返回结果,而不输出到任何地方。

主要特点

  • 返回值: 返回格式化后的字符串。
  • 参数:
    • format: 一个格式字符串,包含格式动词(如 %d, %s, %v 等),指定如何格式化后续参数。
    • a …interface{}: 可变参数列表,是需要格式化的值。

示例

  1. go
  2. 复制代码
  3. package main
  4. import (
  5. "fmt"
  6. )
  7. func main() {
  8. name := "Alice"
  9. age := 30
  10. result := fmt.Sprintf("Name: %s, Age: %d", name, age)
  11. fmt.Println(result)
  12. }
  • 输出:
  1. yaml
  2. 复制代码
  3. Name: Alice, Age: 30

在这个示例中,fmt.Sprintf 返回格式化后的字符串,该字符串然后被传递给 fmt.Println 打印输出。

fmt.Fprintf

定义与用途

  • 定义: func Fprintf(w io.Writer, format string, a ...interface{}) (n int, err error)
  • 用途: 格式化字符串并将结果写入到指定的 io.Writer 目标(例如文件、网络连接、缓冲区等)。

主要特点

  • 返回值:
    • n: 写入的字节数。
    • err: 可能发生的错误。
  • 参数:
    • w: 一个实现了 io.Writer 接口的目标(如 os.Stdout, os.File, bytes.Buffer 等)。
    • format: 一个格式字符串,包含格式动词(如 %d, %s, %v 等),指定如何格式化后续参数。
    • a …interface{}: 可变参数列表,是需要格式化的值。

示例

  1. go
  2. 复制代码
  3. package main
  4. import (
  5. "fmt"
  6. "os"
  7. )
  8. func main() {
  9. name := "Bob"
  10. age := 25
  11. fmt.Fprintf(os.Stdout, "Name: %s, Age: %d\n", name, age)
  12. }
  • 输出:
  1. yaml
  2. 复制代码
  3. Name: Bob, Age: 25

在这个示例中,fmt.Fprintf 将格式化后的字符串写入 os.Stdout,即标准输出。

总结

我们很多时候需要fmt的原因是go是强类型语言,不能进行不同类型变量的直接拼接,所以需要借助fmt下的函数

  • fmt.Sprintf:
    • 用于将格式化后的字符串返回,而不直接输出。
    • 常用于需要将格式化后的字符串存储到变量中,或进一步处理的场景。
  • fmt.Fprintf:
    • 用于将格式化后的字符串写入到指定的 io.Writer。
    • 常用于需要将格式化后的字符串输出到文件、网络连接、缓冲区或其他输出目标的场景。
  • fmt.Printf: 直接将格式化后的字符串输出到标准输出(控制台)。

它们都使用类似的格式化动词和参数,但输出目标不同。fmt.Sprintf 用于返回字符串,fmt.Fprintf 用于写入指定目标,fmt.Printf 用于直接打印到控制台。

记忆方法:

Sprintf函数的s“string”(字符串)的缩写,该函数用于按照指定格式返回一个格式化后的字符串。

Fprintf函数的f“file”(文件)的缩写,此函数向指定的文件输出流(通常是一个文件或类似文件的对象)写入按照指定格式格式化后的内容。

格式化动次

记住四个:%s %d %v %T

:::info General

:::

%v 以默认的方式打印变量的值(**万能格式,但是不能用于字符类型**)
%T 打印变量的类型

:::info Integer

:::

%+d 带符号的整型,fmt.Printf(“%+d”, 255)输出+255
%q 打印单引号
%o 不带零的八进制
%#o 带零的八进制
%x 小写的十六进制
%X 大写的十六进制
%#x 带0x的十六进制
%U 打印Unicode字符
%#U 打印带字符的Unicode
%b 打印整型的二进制

%c 打印字符

:::info Integer width

:::

%5d 表示该整型最大长度是5,下面这段代码

输入输出 - 图1

%-5d则相反,打印结果会自动左对齐
%05d会在数字前面补零。

:::info Float

:::

%f (=%.6f) 6位小数点(没有lf)
%e (=%.6e) 6位小数点(科学计数法)
%g 用最少的数字来表示
%.3g 最多3位数字来表示
%.3f 最多3位小数来表示

:::info String

:::

%s 正常输出字符串
%q 字符串带双引号,字符串中的引号带转义符
%#q 字符串带反引号,如果字符串内有反引号,就用双引号代替
%x 将字符串转换为小写的16进制格式
%X 将字符串转换为大写的16进制格式
% x 带空格的16进制格式
String Width (以5做例子)
%5s 最小宽度为5
%-5s 最小宽度为5(左对齐)
%.5s 最大宽度为5
%5.7s 最小宽度为5,最大宽度为7
%-5.7s 最小宽度为5,最大宽度为7(左对齐)
%5.3s 如果宽度大于3,则截断
%05s 如果宽度小于5,就会在字符串前面补零

:::info Struct

:::

%v 正常打印。比如:{sam {12345 67890}}
%+v 带字段名称。比如:{name:sam phone:{mobile:12345 office:67890}
%#v 用Go的语法打印。
比如main.People{name:”sam”, phone:main.Phone{mobile:”12345”, office:”67890”}}

:::info Boolean

:::

%t 打印true或false

:::info Pointer

:::

%p 带0x的指针
%#p 不带0x的指针

:::info 其他

:::

%%—转义,输出%

最常用

输入输出 - 图2

Printfln

Printf与Println的区别

输入输出 - 图3

结果:

<font style="color:rgb(80, 80, 80);">a = 10</font>

<font style="color:rgb(80, 80, 80);">a = 10</font>

输入

  1. Scanf("%d", &a)
  2. 更简便的格式Scan(&a)