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:布尔值,输出 truefalse

字符串和字节切片占位符

  • %s:输出字符串,适用于 string 类型或 []byte 类型。
  • %q:输出由双引号包围的字符串,其中特殊字符会被转义,适合用于源代码中的字符串字面量。

其他占位符

  • %p:十六进制表示指针值,常用于打印内存地址。
  • %U%#U:用于 Unicode 代码点的格式化,分别输出 U+hhhh0xhhhh 形式。

控制符

除了上述占位符,还可以使用以下控制符来进一步定制输出格式:

  • 宽度:通过在占位符前加上数字来指定最小宽度,例如 %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%
}