golang中占位符
在 Go 语言中,fmt 包提供了强大的格式化字符串和数值的功能。占位符(也称为转换说明符)允许你在输出字符串中预留位置,然后用变量或其他表达式的值来填充。以下是一些常见的占位符及其说明:
标准占位符
- %v:默认格式化值。如果不确定类型,可以使用此占位符。
- %#v:Go 语法表示的值,对于结构体会包含字段名。
- %T:打印变量的类型。
- %%:输出一个百分号(
%)。
数字类型占位符
- %d:十进制整数。
- %b:二进制整数。
- %c:单个字符(由整数或
rune类型转换而来)。 - %o:八进制整数。
- %x 或 %X:十六进制整数,分别使用小写字母
a-f或大写字母A-F。 - %e 或 %E:科学记数法表示浮点数,分别使用小写
e或大写E。 - %f:标准浮点数格式。
- %g 或 %G:使用
%e或%f中较短的一种格式表示浮点数,去掉不必要的小数点后缀。 - %t:布尔值,输出
true或false。
字符串和字节切片占位符
- %s:输出字符串,适用于
string类型或[]byte类型。 - %q:输出由双引号包围的字符串,其中特殊字符会被转义,适合用于源代码中的字符串字面量。
其他占位符
- %p:十六进制表示指针值,常用于打印内存地址。
- %U 和 %#U:用于 Unicode 代码点的格式化,分别输出
U+hhhh和0xhhhh形式。
控制符
除了上述占位符,还可以使用以下控制符来进一步定制输出格式:
- 宽度:通过在占位符前加上数字来指定最小宽度,例如
%5d。 - 精度:对于浮点数和字符串,可以在宽度后加上一个点和数字来指定精度或最大长度,例如
%.2f或%10.5s。 - 对齐方式:通过在宽度前加
-来左对齐,不加则默认右对齐。
例如,%-10s 会使字符串左对齐并至少占据 10 个字符空间,不足的部分用空格填充。
示例:
package main
import "fmt"
/*
不换行、纯文本 → 用 fmt.Print()
简单输出 → 用 fmt.Println()
带格式输出 → 用 fmt.Printf()
*/
/*
%v 万能打印值
%T 看类型
%d 整数
%f 小数
%.2f 保留2位小数
%s 字符串
%t 布尔
%p 地址
%b 二进制
%x 十六进制
%q 带引号字符串
%% 输出%
*/
func main() {
// 定义一些变量
num := 255
pi := 3.1415926
name := "Go语言"
ok := true
arr := []int{1, 2, 3}
fmt.Println("===== 1. 通用输出 =====")
fmt.Printf("值: %v\n", num) //值:255
fmt.Printf("带字段(结构体/数组): %+v\n", arr) //带字段(结构体/数组): [1 2 3]
fmt.Printf("Go语法格式: %#v\n", name) //Go语法格式: "Go语言"
fmt.Printf("变量类型: %T\n", pi) //变量类型: float64
fmt.Println("\n===== 2. 整数相关 =====")
fmt.Printf("十进制: %d\n", num) //十进制: 255
fmt.Printf("二进制: %b\n", num) //二进制: 11111111
fmt.Printf("八进制: %o\n", num) //八进制: 377
fmt.Printf("十六进制小写: %x\n", num) //十六进制小写: ff
fmt.Printf("十六进制大写: %X\n", num) //十六进制大写: FF
fmt.Printf("字符(ASCII): %c\n", 65) //字符(ASCII): A
fmt.Println("\n===== 3. 浮点数 =====")
fmt.Printf("默认小数: %f\n", pi) //默认小数: 3.141593
fmt.Printf("保留2位: %.2f\n", pi) //保留2位: 3.14
fmt.Printf("科学计数法: %e\n", pi) //科学计数法: 3.141593e+00
fmt.Printf("自动精简: %g\n", pi) //自动精简: 3.141593
fmt.Println("\n===== 4. 字符串 =====")
fmt.Printf("字符串: %s\n", name) //字符串: Go语言
fmt.Printf("带引号: %q\n", name) //带引号: "Go语言"
fmt.Println("\n===== 5. 布尔值 =====")
fmt.Printf("bool: %t\n", ok) //bool: true
fmt.Println("\n===== 6. 指针地址 =====")
fmt.Printf("变量地址: %p\n", &num) //变量地址: 0xc0000160b8
fmt.Println("\n===== 7. 对齐与宽度 =====")
fmt.Printf("右对齐占5位: |%5d|\n", 12) //右对齐占5位: | 12|
fmt.Printf("左对齐占5位: |%-5d|\n", 12) //左对齐占5位: |12 |
fmt.Printf("截取前2字符: %.2s\n", name) //截取前2字符: Go
fmt.Println("\n===== 8. 输出百分号 =====")
fmt.Printf("百分比: %d%%\n", 99) //百分比: 99%
}