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{}: 可变参数列表,是需要格式化的值。
示例
go
复制代码
package main
import (
"fmt"
)
func main() {
name := "Charlie"
age := 28
fmt.Printf("Name: %s, Age: %d\n", name, age)
}
- 输出:
yaml
复制代码
Name: Charlie, Age: 28
在这个示例中,fmt.Printf 将格式化后的字符串直接输出到标准输出(控制台)。
fmt.Sprintf
定义与用途
- 定义: func Sprintf(format string, a …interface{}) string
- 用途: 格式化字符串并返回结果,而不输出到任何地方。
主要特点
- 返回值: 返回格式化后的字符串。
- 参数:
- format: 一个格式字符串,包含格式动词(如 %d, %s, %v 等),指定如何格式化后续参数。
- a …interface{}: 可变参数列表,是需要格式化的值。
示例
go
复制代码
package main
import (
"fmt"
)
func main() {
name := "Alice"
age := 30
result := fmt.Sprintf("Name: %s, Age: %d", name, age)
fmt.Println(result)
}
- 输出:
yaml
复制代码
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{}: 可变参数列表,是需要格式化的值。
示例
go
复制代码
package main
import (
"fmt"
"os"
)
func main() {
name := "Bob"
age := 25
fmt.Fprintf(os.Stdout, "Name: %s, Age: %d\n", name, age)
}
- 输出:
yaml
复制代码
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,下面这段代码%-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 其他
:::
%%—转义,输出%
最常用
Printfln
Printf与Println的区别
结果:<font style="color:rgb(80, 80, 80);">a = 10</font>
<font style="color:rgb(80, 80, 80);">a = 10</font>
输入
Scanf("%d", &a)
- 更简便的格式
Scan(&a)