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("%%
")			//%
	t := People{Name: "golang"}
    fmt.Printf("%v
", t)		//{golang}
    fmt.Printf("%+v
", t)		//{Name:golang}
    fmt.Printf("%#v
", t)		//main.People{Name:"golang"}
	fmt.Printf("%T
", t)		//main.People
	
	//#v
	fmt.Printf("%#v
", 1)                                    //1
	fmt.Printf("%#v
", "hello")                              //“hello"
	fmt.Printf("%#v
", []int{1, 2})                          //[]int{1,2}
	fmt.Printf("%#v
", map[string]interface{}{})             //map[string]interface {}{}
	fmt.Printf("%#v
", 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
", 12)     //1100
fmt.Printf("%c
", 97)     //a
fmt.Printf("%d
", 010)    //8
fmt.Printf("%o
", 10)     //12
fmt.Printf("%O
", 10)     //0o12
fmt.Printf("%q
", 0x4E2D) //'中'
fmt.Printf("%x
", 10)     //a
fmt.Printf("%X
", 10)     //A
fmt.Printf("%U
", 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
", 123456.789)	//4953959590107546p-52
fmt.Printf("%e
", 123456.789)	//1.234568e+05
fmt.Printf("%E
", 123456.789)	//1.234568E+05
fmt.Printf("%f
", 123456.789)	//123456.789000
fmt.Printf("%F
", 123456.789)	//123456.789000
fmt.Printf("%g
", 123456.789)	//123456.789
fmt.Printf("%G
", 123456.789)	//123456.789
fmt.Printf("%x
", 123456.789)	//0x1.e240c9fbe76c9p+16
fmt.Printf("%X
", 123456.789)	//0x1.e240c9fbe76c9p+16

字符串与字节切片

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

实例

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

切片

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

实例

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

指针

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

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

实例

x := 1
fmt.Printf("%p
", &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
", int(15))  //15
fmt.Printf("%v
", uint(15))  //15
fmt.Printf("%#v
", uint(15)) //0xf
fmt.Printf("%#x
", int(15))  //0xf
fmt.Printf("%#x
", uint(15)) //0xf
//chan
ch := make(chan string, 1)
ch <- "golang"
fmt.Printf("%v
", ch) //0xc000046060
fmt.Printf("%p
", ch) //0xc000046060

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

github个人博客

https://wangyufenggogogo.github.io

原文地址:https://www.cnblogs.com/fenggedainifei/p/15335843.html