当我执行此操作时:
insertvertex()
它打印buf := new(bytes.Buffer)
buf.WriteString("Hello world")
fmt.Println(buf)
。
但是,如果我执行此操作:
Hello World
它打印:var buf bytes.Buffer
buf.WriteString("Hello world")
fmt.Println(buf)
我知道这是结构byte.Buffer的内容,但是为什么以不同的格式打印?
答案 0 :(得分:9)
因为类型*bytes.Buffer
的值具有String()
方法(*bytes.Buffer
的{{3}}包含String()
方法)和类型{ {1}}没有。
然后bytes.Buffer
包检查要打印的值是否具有fmt
方法,如果有,则调用该方法以产生值的字符串表示形式。
引用method set软件包的文档:
除了使用动词%T和%p进行打印时,特殊的格式注意事项适用于实现某些接口的操作数。按申请顺序:
如果操作数是reflect.Value,则将操作数替换为其所保存的具体值,并使用下一条规则继续打印。
如果操作数实现Formatter接口,则将调用它。格式化程序可以很好地控制格式化。
如果%v动词与#标志(%#v)一起使用,并且操作数实现GoStringer接口,则会被调用。
如果格式(对于Println等而言是隐含的%v)对于字符串(%s%q%v%x%X)有效,则以下两个规则适用:
如果操作数实现了error接口,则将调用Error方法将对象转换为字符串,然后根据动词的要求对其进行格式化(如果有)。
如果操作数实现方法String()字符串,则将调用该方法将对象转换为字符串,然后将根据动词的要求对其进行格式化(如果有)。
String() string
方法以Buffer.String()
的形式返回其内容,这就是您传递string
类型的指针时看到的内容。并且当您传递类型为*bytes.Buffer
的非指针值时,它就像普通的struct值一样被简单地打印,其默认格式为:
bytes.Buffer
查看相关/类似问题: