标准库之fmt
1、格式化输出的占位符
//Printf 格式化输出 fmt.Printf("% + v\n", u) //格式化输出结构 fmt.Printf("%#v\n", u) //输出值的 Go 语言表示方法 fmt.Printf("%T\n", u) //输出值的类型的 Go 语言表示 fmt.Printf("%t\n", true) //输出值的 true 或 false fmt.Printf("%b\n", 1024) //二进制表示 fmt.Printf("%c\n", 11111111) //数值对应的 Unicode 编码字符 fmt.Printf("%d\n", 10) //十进制表示 fmt.Printf("%o\n", 8) //八进制表示 fmt.Printf("%q\n", 22) //转化为十六进制并附上单引号 fmt.Printf("%x\n", 1223) //十六进制表示,用a-f表示 fmt.Printf("%X\n", 1223) //十六进制表示,用A-F表示 fmt.Printf("%U\n", 1233) //Unicode表示 fmt.Printf("%b\n", 12.34) //无小数部分,两位指数的科学计数法6946802425218990p-49 fmt.Printf("%e\n", 12.345) //科学计数法,e表示 fmt.Printf("%E\n", 12.34455) //科学计数法,E表示 fmt.Printf("%f\n", 12.3456) //有小数部分,无指数部分 fmt.Printf("%g\n", 12.3456) //根据实际情况采用%e或%f输出 fmt.Printf("%G\n", 12.3456) //根据实际情况采用%E或%f输出 fmt.Printf("%s\n", "wqdew") //直接输出字符串或者[]byte fmt.Printf("%q\n", "dedede") //双引号括起来的字符串 fmt.Printf("%x\n", "abczxc") //每个字节用两字节十六进制表示,a-f表示 fmt.Printf("%X\n", "asdzxc") //每个字节用两字节十六进制表示,A-F表示 fmt.Printf("%p\n", 0x123) //0x开头的十六进制数表示
2、Stringer 接口
Stringer接口的定义如下:
type Stringer interface { String() string }
示例:
type Person struct { Name string Age int Sex int } //为Person增加String方法 func (this *Person) String() string { buffer := bytes.NewBufferString("This is ") buffer.WriteString(this.Name + ", ") if this.Sex == 0 { buffer.WriteString("He ") } else { buffer.WriteString("She ") } buffer.WriteString("is ") buffer.WriteString(strconv.Itoa(this.Age)) buffer.WriteString(" years old.") return buffer.String() }
3、Formatter 接口
Formatter 接口的定义如下:
type Formatter interface { Format(f State, c rune) }
通过实现 Formatter 接口可以做到自定义输出格式(自定义占位符)。
示例:
type Person struct { Name string Age int Sex int } func (this *Person) Format(f fmt.State, c rune) { if c == 'L' { f.Write([]byte(this.String())) f.Write([]byte(" Person has three fields.")) } else { // 没有此句,会导致 fmt.Printf("%s", p) 啥也不输出 f.Write([]byte(fmt.Sprintln(this.String()))) } } func main(){ p := &Person{"polaris", 28, 0} fmt.Printf("%L", p) }
注意:
1)fmt.State 是一个接口。由于 Format 方法是被 fmt 包调用的,它内部会实例化好一个 fmt.State 接口的实例,我们不需要关心该接口;
2)可以实现自定义占位符,同时 fmt 包中和类型相对应的预定义占位符会无效。因此例子中 Format 的实现加上了 else 子句;
3)实现了 Formatter 接口,相应的 Stringer 接口不起作用。但实现了 Formatter 接口的类型应该实现 Stringer 接口,这样方便在 Format 方法中调用 String() 方法。就像本例的做法;
4)Format 方法的第二个参数是占位符中%后的字母(有精度和宽度会被忽略,只保留字母);
4、GoStringer 接口
GoStringer 接口定义如下:
type GoStringer interface { GoString() string }
该接口定义了类型的Go语法格式。用于打印(Printf)格式化占位符为 %#v 的值。
示例:
type Person struct { Name string Age int Sex int } func (this *Person) GoString() string { return "&Person{Name is "+this.Name+", Age is "+strconv.Itoa(this.Age)+", Sex is "+strconv.Itoa(this.Sex)+"}" }
参考:fmt — 格式化 IO · Go语言标准库 (studygolang.com)