fmt 包实现了格式化I/O函数,类似于C的 printf 和 scanf. 格式“占位符”衍生自C,但比C更简单。

占位符:
一般:
%v    相应值的默认格式。在打印结构体时,“加号”标记(%+v)会添加字段名
%#v    相应值的Go语法表示
%T    相应值的类型的Go语法表示
%%    字面上的百分号,并非值的占位符

布尔:
%t    单词 true 或 false。

整数:
%b    二进制表示
%c    相应Unicode码点所表示的字符
%d    十进制表示
%o    八进制表示
%q    单引号围绕的字符字面值,由Go语法安全地转义
%x    十六进制表示,字母形式为小写 a-f
%X    十六进制表示,字母形式为大写 A-F
%U    Unicode格式:U+1234,等同于 "U+%04X"

浮点数及其复合构成:
%b    无小数部分的,指数为二的幂的科学计数法,与 strconv.FormatFloat的 'b' 转换格式一致。例如 -123456p-78
%e    科学计数法,例如 -1234.456e+78
%E    科学计数法,例如 -1234.456E+78
%f    有小数点而无指数,例如 123.456
%g    根据情况选择 %e 或 %f 以产生更紧凑的(无末尾的0)输出
%G    根据情况选择 %E 或 %f 以产生更紧凑的(无末尾的0)输出

字符串与字节切片:
%s    字符串或切片的无解译字节
%q    双引号围绕的字符串,由Go语法安全地转义
%x    十六进制,小写字母,每字节两个字符
%X    十六进制,大写字母,每字节两个字符

指针:
%p    十六进制表示,前缀 0x

举例如下:

package main

import "fmt"

func main() {
	var str string
	var person struct {
		name string
		age  int
	}
	person.name = "老王"
	person.age = 50

	str = "hello world"
	fmt.Println("====一般占位符====")
	fmt.Printf("%v\n", str)     //hello world
	fmt.Printf("%v\n", person)  //{老王 50}
	fmt.Printf("%+v\n", person) //{name:老王 age:50}
	fmt.Printf("%#v\n", str)    //"hello world"
	fmt.Printf("%#v\n", true)   //true
	fmt.Printf("%T\n", str)     //string
	fmt.Printf("%T\n", true)    //bool
	fmt.Printf("%%\n")          //%
	fmt.Println("====布尔====")
	fmt.Printf("%t\n", true)
	fmt.Println("====整数====")
	fmt.Printf("%b\n", 65) //1000001
	fmt.Printf("%c\n", 65) //A
	fmt.Printf("%d\n", 65) //65
	fmt.Printf("%o\n", 65) //101
	fmt.Printf("%q\n", 65) //'A'
	fmt.Printf("%x\n", 31) //1f
	fmt.Printf("%X\n", 31) //1F
	fmt.Printf("%U\n", 31) //U+001F
	fmt.Println("====浮点数及其复合构成====")
	fmt.Printf("%b\n", 10.5) //5910974510923776p-49
	fmt.Printf("%e\n", 10.5) //1.050000e+01
	fmt.Printf("%E\n", 10.5) //1.050000E+01
	fmt.Printf("%f\n", 10.5) //10.500000
	fmt.Printf("%g\n", 10.5) //10.5
	fmt.Printf("%G\n", 10.5) //10.5
	fmt.Println("====字符串与字节切片====")
	fmt.Printf("%s\n", "abc") //abc
	fmt.Printf("%q\n", "abc") //"abc"
	fmt.Printf("%x\n", "abc") //616263
	fmt.Printf("%X\n", "abc") //616263
	fmt.Println("====指针====")
	fmt.Printf("%p\n", &str) //0xc0000441f0
}