标准库之fmt
1、格式化输出的占位符
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | //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接口的定义如下:
1 2 3 | type Stringer interface { String() string } |
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | 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 接口的定义如下:
1 2 3 | type Formatter interface { Format(f State, c rune) } |
通过实现 Formatter 接口可以做到自定义输出格式(自定义占位符)。
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | 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 接口定义如下:
1 2 3 | type GoStringer interface { GoString() string } |
该接口定义了类型的Go语法格式。用于打印(Printf)格式化占位符为 %#v 的值。
示例:
1 2 3 4 5 6 7 8 9 | 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)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· 单线程的Redis速度为什么快?
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码