Golang的字符串占位符在fmt
包的各种打印函数中使用,如 fmt.Printf
、fmt.Sprintf
。在c、java的基础上有所改动,故这里作此介绍。
1 变量值与类型
%v
:打印变量的值,会根据变量的类型选择合适的默认格式进行打印- 对于结构体,打印结构体的字段。
- 对于指针类型,打印指针指向的值。
%+v
:类似 %v,但会打印结构体的字段名%#v
:打印值的Go语言语法表示%T
:打印变量的类型
x := 42
y := "hello"
z := 3.14
fmt.Printf("x: %v, type: %T\n", x, x)
fmt.Printf("y: %v, type: %T\n", y, y)
fmt.Printf("z: %v, type: %T\n", z, z)
x: 42, type: int
y: hello, type: string
z: 3.14, type: float64
type Person struct {
Name string
Age int
}
person := Person{
Name: "Teresa",
Age: 17,
}
fmt.Printf("值的默认格式表示: %v\n", person)
fmt.Printf("值带结构体的字段名表示: %+v\n", person)
fmt.Printf("值的Go语言语法表示: %#v\n", person)
值的默认格式表示: {Teresa 17}
值带结构体的字段名表示: {Name:Teresa Age:17}
值的Go语言语法表示: main.Person{Name:"Teresa", Age:17}
2 整数
%d
:十进制表示%b
:二进制表示%o
:八进制表示%x
/%X
:十六进制表示(字母小写/大写;下同)
n := 42
fmt.Printf("十进制: %d\n", n)
fmt.Printf("二进制: %b\n", n)
fmt.Printf("八进制: %o\n", n)
fmt.Printf("十六进制(小写): %x\n", n)
fmt.Printf("十六进制(大写): %X\n", n)
十进制: 42
二进制: 101010
八进制: 52
十六进制(小写): 2a
十六进制(大写): 2A
3 浮点数
%f
:有小数点的十进制表示%e
/%E
:科学计数法%g
/%G
:根据情况选择%f
或%e
f := 3.1415926
fmt.Printf("浮点数: %f\n", f)
fmt.Printf("科学计数法(小写): %e\n", f)
fmt.Printf("科学计数法(大写): %E\n", f)
浮点数: 3.141593
科学计数法(小写): 3.141593e+00
科学计数法(大写): 3.141593E+00
4 字符、字符串和字节切片
%%
: 百分号字符(%
)%c
:字符%U
:字符的Unicode码点%s
:直接输出字符串或字节切片%q
:使用双引号括起来的字符串%x
/%X
:每个字节用两字符的十六进制表示
fmt.Printf("百分号: 37%%\n")
var char1 rune = 'A'
var char2 rune = '中'
var char3 rune = '😊'
fmt.Printf("char1: %c Unicode: %U\n", char1, char1)
fmt.Printf("char2: %c Unicode: %U\n", char2, char2)
fmt.Printf("char3: %c Unicode: %U\n", char3, char3)
百分号: 37%
char1: A Unicode: U+0041
char2: 中 Unicode: U+4E2D
char3: 😊 Unicode: U+1F60A
s := "hello"
fmt.Printf("字符串: %s\n", s)
fmt.Printf("带引号的字符串: %q\n", s)
fmt.Printf("每个字节用十六进制表示(小写): %x\n", s)
fmt.Printf("每个字节用十六进制表示(大写): %X\n", s)
字符串: hello
带引号的字符串: "hello"
每个字节用十六进制表示(小写): 68656c6c6f
每个字节用十六进制表示(大写): 68656C6C6F
5 指针
%p
:指针地址
t := 100
p := &t
fmt.Printf("指针地址: %p\n", p)
指针地址: 0xc00001a128
6 布尔值
%t
:布尔值(true
或false
)
b := true
fmt.Printf("布尔值:%t\n", b)
布尔值:true