🚀本系列文章为个人学习笔记,目的是巩固知识并记录我的学习过程及理解。文笔和排版可能拙劣,望见谅。
目录
-
- 1.1 fmt.Print
- 1.2 fmt.Println
- 1.3 fmt.Printf
在Golang中,格式化输出是非常常用的操作,特别是在打印调试信息或输出结果时。Golang 提供了一组强大的格式化函数,主要在 fmt 包中定义。这些函数支持多种类型和格式的输出。以下是对 Go 中各种格式化输出的详细介绍:
1. 基本格式化函数
1.1 fmt.Print
fmt.Print
直接输出内容,没有格式化。可以接受多个参数,参数之间会自动添加空格。
fmt.Print("Hello", "World") // 输出: Hello World
1.2 fmt.Println
fmt.Println
类似于 fmt.Print
,但会在末尾添加一个换行符。
fmt.Println("Hello", "World") // 输出: Hello World\n
1.3 fmt.Printf
fmt.Printf
允许使用格式化动词来格式化输出,类似于 C 语言中的 printf
函数。
fmt.Printf("Name: %s, Age: %d\n", "Alice", 30) // 输出: Name: Alice, Age: 30
2. 常用格式化动词
2.1 通用动词
2.1.1 %v
按变量的默认格式输出。
fmt.Printf("%v\n", "Hello") // 输出: Hello
2.1.2 %+v
对结构体,会输出字段名和值。
type Person struct {
Name string
Age int
}
fmt.Printf("%+v\n", Person{"Alice", 30}) // 输出: {Name:Alice Age:30}
2.1.3 %#v
输出 Go 语法表示形式。
fmt.Printf("%#v\n", Person{"Alice", 30}) // 输出: main.Person{Name:"Alice", Age:30}
2.1.4 %T
输出变量的类型。
fmt.Printf("%T\n", 123) // 输出: int
2.1.5 %%
输出百分号本身。
fmt.Printf("%%\n") // 输出: %
2.2 布尔型
2.2.1 %t
输出 true
或 false
。
fmt.Printf("%t\n", true) // 输出: true
2.3 整型
2.3.1 %b
二进制表示。
fmt.Printf("%b\n", 5) // 输出: 101
2.3.2 %c
Unicode 码点对应的字符。
fmt.Printf("%c\n", 65) // 输出: A
2.3.3 %d
十进制表示。
fmt.Printf("%d\n", 123) // 输出: 123
2.3.4 %o
八进制表示。
fmt.Printf("%o\n", 123) // 输出: 173
2.3.5 %q
单引号围绕的字符字面值,使用Go语法。
fmt.Printf("%q\n", 65) // 输出: 'A'
2.3.6 %x
十六进制,小写字母。
fmt.Printf("%x\n", 255) // 输出: ff
2.3.7 %X
十六进制,大写字母。
fmt.Printf("%X\n", 255) // 输出: FF
2.4 浮点型及复数
2.4.1 %e
科学计数法,小写 e。
fmt.Printf("%e\n", 123456.789) // 输出: 1.234568e+05
2.4.2 %E
科学计数法,大写 E。
fmt.Printf("%E\n", 123456.789) // 输出: 1.234568E+05
2.4.3 %f
有小数点但无指数部分。
fmt.Printf("%f\n", 123456.789) // 输出: 123456.789000
2.4.4 %g
根据实际情况选择 %e
或 %f
表示。
fmt.Printf("%g\n", 123456.789) // 输出: 123456.789
2.4.5 %G
根据实际情况选择 %E
或 %f
表示。
fmt.Printf("%G\n", 123456.789) // 输出: 123456.789
2.5 字符串和字节切片
2.5.1 %s
输出字符串或字节切片。
fmt.Printf("%s\n", "Hello") // 输出: Hello
2.5.2 %q
双引号围绕的字符串字面值,使用 Go 语法。
fmt.Printf("%q\n", "Hello") // 输出: "Hello"
2.5.3 %x
每个字节用两个字符表示的十六进制。
fmt.Printf("%x\n", "Hello") // 输出: 48656c6c6f
2.5.4 %X
每个字节用两个字符表示的十六进制,大写。
fmt.Printf("%X\n", "Hello") // 输出: 48656C6C6F
2.6 指针
2.6.1 %p
指针的十六进制表示,前缀 0x
。
var p *int
fmt.Printf("%p\n", p) // 输出: 0x<地址>
3. 宽度和精度控制
宽度和精度控制用于调整输出格式:
- 宽度: 数字前的整数,用于指定最小宽度。
- 精度:
.
后的数字,用于指定浮点数的小数位数或字符串的最大长度。
例子:
fmt.Printf("%6d\n", 123) // 输出: ' 123'
fmt.Printf("%6.2f\n", 1.2) // 输出: ' 1.20'
fmt.Printf("%.2s\n", "abcdef") // 输出: 'ab'
4. 组合使用示例
通过组合使用这些动词,可以创建复杂的格式化输出。例如:
type Point struct {
X, Y int
}
p := Point{1, 2}
fmt.Printf("%v\n", p) // 输出: {1 2}
fmt.Printf
("%+v\n", p) // 输出: {X:1 Y:2}
fmt.Printf("%#v\n", p) // 输出: main.Point{X:1, Y:2}
fmt.Printf("%T\n", p) // 输出: main.Point
fmt.Printf("%t\n", true) // 输出: true
fmt.Printf("%d\n", 123) // 输出: 123
fmt.Printf("%0.2f\n", 1.2345) // 输出: 1.23