Go小知识:%v %+v %#v的区别

2,455 阅读1分钟

Go小知识:%v %+v %#v的区别

查看注释

在Go语言的源码当中,很多函数都有很清晰的注释,告诉我们使用方法和注意事项,我们应该养成经常阅读源码的习惯,清楚了底层的实现原理,日常开发中碰见的很多问题自然就会迎刃而解了。

关于fmt.Printf()函数提供了很多像C语言一样的占位符,由于关于占位符的描述信息太多了,Go语言开发者们并没有将描述信息直接放在fmt.Printf()函数的实现旁边,而是单独写了一个注释文件,用于解释占位符信息,具体的位置在src > fmt > doc.go当中:

1.png

我们展开这个文件内容,可以看到关于%v%+v%#v的描述信息:

%v the value in a default format when printing structs, the plus flag (%+v) adds field names %#v a Go-syntax representation of the value

翻译过来就是:

  • %v:会以默认形式打印值,当打印结构体的时候,"+"会打印字段名称。
  • %#v:值的Go语法表示法

代码测试

可能直接看解释有点模糊,我们直接写一段代码进行测试便清楚了:

package main

import "fmt"

type student struct {
	name string
	id int
}

func main() {
	s := &student{"jiafu", 123456}
	fmt.Printf("%%v的方式  = %v\n", s)
	fmt.Printf("%%+v的方式 = %+v\n", s)
	fmt.Printf("%%#v的方式 = %#v\n", s)
}

输出结果如下:

%v的方式  = &{jiafu 123456}
%+v的方式 = &{name:jiafu id:123456}
%#v的方式 = &main.student{name:"jiafu", id:123456}

总结

  1. %v 只输出所有的值
  2. %+v 先输出字段类型,再输出该字段的值
  3. %#v 先输出结构体名字值,再输出结构体(字段类型+字段的值)