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
}