fmt 格式化指令

golang的fmt包格式化I/O函数的实现与类似C语言的printfscanf类似。格式的verbs源于C,但是更简单。以下在路径src/fmt/doc.go可找到。

一般的指令

格式化指令 说明
%v 该值的默认格式
%+v 当打印结构体时,+表示添加字段名称
%#v 该值的go语法表示形式
%T 该值类型
%% 输出%,无任何值

实例

type People struct {
	Name string
}

func main() {
	fmt.Printf("%%\n")			//%
	t := People{Name: "golang"}
    fmt.Printf("%v\n", t)		//{golang}
    fmt.Printf("%+v\n", t)		//{Name:golang}
    fmt.Printf("%#v\n", t)		//main.People{Name:"golang"}
	fmt.Printf("%T\n", t)		//main.People
	
	//#v
	fmt.Printf("%#v\n", 1)                                    //1
	fmt.Printf("%#v\n", "hello")                              //“hello"
	fmt.Printf("%#v\n", []int{1, 2})                          //[]int{1,2}
	fmt.Printf("%#v\n", map[string]interface{}{})             //map[string]interface {}{}
	fmt.Printf("%#v\n", struct{ Hello string }{Hello: "tom"}) //struct { Hello string }{Hello:"tom"}
}

布尔类型占位符

格式化指令 说明
%t true或者false

实例

fmt.Printf("%t", true)	//true

Integer类型的占位符

格式化指令 说明
%b 一个二进制整数,将一个整数格式化为二进制的表达式
%c 一个Unicode的字符
%d 十进制数值
%o 八进制数值
%O 以0o为前置的八进制数值
%q 单引号围绕的字符字面量的值,由Go语法安全地转义
%x 小写的十六进制数值
%X 大写的十六进制数值
%U 一个Unicode表示法表示的整型码值,默认是4个数字字符

实例

fmt.Printf("%b\n", 12)     //1100
fmt.Printf("%c\n", 97)     //a
fmt.Printf("%d\n", 010)    //8
fmt.Printf("%o\n", 10)     //12
fmt.Printf("%O\n", 10)     //0o12
fmt.Printf("%q\n", 0x4E2D) //'中'
fmt.Printf("%x\n", 10)     //a
fmt.Printf("%X\n", 10)     //A
fmt.Printf("%U\n", 97)     //U+0061

浮点数和复数的组成部分

格式化指令 说明
%b 无小数部分,指数为二的幂的科学计数法,与strconv.FormatFloat的‘b’转换格式一致
%e 科学计数法
%E 科学计数法
%f 有小数点无指数
%F 有小数点无指数,注:是%f的同义词
%g 根据情况选择%e或%f,大指数选%e,否则选%f
%G 根据情况选择%E或%F,大指数选%E,否则选%F
%x 十六进制表示法(十进制幂为两个指数)
%X 大写的十六进制表示法

实例

fmt.Printf("%b\n", 123456.789)	//4953959590107546p-52
fmt.Printf("%e\n", 123456.789)	//1.234568e+05
fmt.Printf("%E\n", 123456.789)	//1.234568E+05
fmt.Printf("%f\n", 123456.789)	//123456.789000
fmt.Printf("%F\n", 123456.789)	//123456.789000
fmt.Printf("%g\n", 123456.789)	//123456.789
fmt.Printf("%G\n", 123456.789)	//123456.789
fmt.Printf("%x\n", 123456.789)	//0x1.e240c9fbe76c9p+16
fmt.Printf("%X\n", 123456.789)	//0x1.e240c9fbe76c9p+16

字符串与字节切片

格式化指令 说明
%s 输出字符串(string类型或[]byte)
%q 双引号围绕的字符串,由Go语法安全地转义
%x 十六进制,小写字母,每个字节两个字符
%X 十六进制,大写字母,每个字节两个字符

实例

str := "Golang"
str1 := []byte(str)
fmt.Printf("%s\n", str)  //Golang
fmt.Printf("%s\n", str1) //Golang
fmt.Printf("%q\n", str)  //"Golang"
fmt.Printf("%x\n", str)  //476f6c616e67
fmt.Printf("%X\n", str)  //476F6C616E67

切片

格式化指令 说明
%p 以16进制表示的切片第0个元素的地址,开头为0x

实例

slices := []int{1, 2, 3, 4}
fmt.Printf("%p\n", slices) //0xc00000e3a0
fmt.Println(&slices[0])    //0xc00000e3a0

指针

格式化指令 说明
%p 以16进制表示,前缀为0x

注:%b, %d, %o, %x and %X这些指令也可与指针配合使用,将值格式化为整数.

实例

x := 1
fmt.Printf("%p\n", &x) //0xc0000160f0

%v的不同类型下的默认的格式化指令

类型 格式化指令
bool %t
int、int8 etc %d
uint、uint8 etc %d(%#x如果是使用%#v打印)
float32、complex64 etc %g
string %s
chan %p
pointer %p

实例

//uint
fmt.Printf("%#v\n", int(15))  //15
fmt.Printf("%v\n", uint(15))  //15
fmt.Printf("%#v\n", uint(15)) //0xf
fmt.Printf("%#x\n", int(15))  //0xf
fmt.Printf("%#x\n", uint(15)) //0xf
//chan
ch := make(chan string, 1)
ch <- "golang"
fmt.Printf("%v\n", ch) //0xc000046060
fmt.Printf("%p\n", ch) //0xc000046060

对于复合对象,使用以上规则递归的打印对象

github个人博客

https://wangyufenggogogo.github.io