fmt.Printf动词需严格匹配变量类型,否则运行时panic;%d仅用于整数,%f/%g/%e专用于浮点数,%s仅接受string或[]byte,%t只认bool,%c接收rune,结构体用%v/%+v/%#v区分输出格式,修饰符语义因动词而异,构造字符串应优先用fmt.Sprintf而非fmt.Printf。
的动词(verb)不是越多越好,关键是匹配变量类型和输出意图。用错动词会 panic 或输出不可预期的内容,比如
打
、
打 struct、
打 int 都会出错。
怎么选动词:按变量类型对号入座
动词选错是 runtime panic 的高频原因,不是语法错误,编译期发现不了。
只用于整数类型(
,
,
等),不能用于
或
,
,
专用于浮点数,传整数会报
仅接受
或
;传 struct 默认只输出
,不是字段内容
只认
,传字符串如
会输出
接收的是 rune/uint32(Unicode 码点),不是字符串,
会 panic
结构体输出:%v %+v %#v 三个最常用的区别
调试时看结构体,这三个动词行为差异明显,混用会导致信息缺失或冗余。
:默认格式,字段值按顺序输出,无字段名,如
:带字段名,适合快速确认字段赋值是否正确,如
:输出 Go 语法字面量,含包名和类型,适合生成可复用的测试数据,如
三者都不触发自定义
方法,只有
在类型实现了
时才调用它
精度和宽度修饰符:语义因动词而异
修饰符不是通用的,同一组
对
和
含义完全不同。
go语言参考手册 中文CHM版
Go 是一个开源的编程语言,它能让构造简单、可靠且高效的软件变得容易。本文给大家带来Go参考手册,需要的可以来下载! Go是从2007年末由Robert Griesemer, Rob Pike, Ken Thompson主持开发,后来还加入了Ian Lance Taylor, Russ Cox等人,并最终于2009年11月开源,在2012年早些时候发布了Go 1稳定版本。现在Go的开发已经是完全开放的,并且拥有一个活跃的社区。 Go 语言特色 简洁、快速、安全 并行、有趣、开源 内存管理、v数组安全、编译
下载
:截取前 2 个字符(
→
)
:保留 2 位小数(
→
)
:总宽至少 6,右对齐,不足补空格;
是左对齐
:整数不足 6 位时前面补 0(
→
)
对字符串加双引号并转义(
→
),适合日志,不适合 UI 展示
fmt.Printf vs fmt.Sprintf:别在需要字符串的地方硬写到 stdout
函数用途错配是隐蔽 bug 源,尤其在拼接 SQL、HTTP header、JSON key 等场景。
立即学习
“
go语言免费学习笔记(深入)
”;
要输出到终端或日志文件:用
或
要构造一个字符串供后续使用(比如传给
):必须用
,
不返回值
高频循环中拼接字符串,
会分配内存,应改用
+
看似等价于
,但在并发日志中可能被其他 goroutine 的输出打断,导致错乱
实际使用时最容易忽略的是动词与类型的严格绑定,以及
和
这类“增强型”动词在嵌套结构体或指针上的表现——它们不会递归展开内部字段,除非每个嵌套类型也实现了
。
fmt.Printf%dfloat64%s%f%dintint64uintfloat64string%f%g%efmt.Printf: %f verb not allowed for integer%sstring[]byte{}%tbool"true"%!t(string=true)%cfmt.Printf("%c", "a")%v{42 true}%+v{ID:42 Active:true}%#vmain.User{ID:42, Active:true}String()%vfmt.Stringer.2%s%f%.2s"hello""he"%.2f3.141593.14%6s%-6s%06d42000042%q"a
b""a\nb"fmt.Printffmt.Printlnhttp.Header.Setfmt.Sprintffmt.Printffmt.Sprintfstrings.Builderfmt.Fprintfmt.Print("key=", k, ", val=", v)fmt.Printf("key=%v, val=%v", k, v)%#v%+vfmt.Stringer