登录
首页 >  Golang >  Go问答

在 Go 中打印 bytes.Buffer 时的不同行为

来源:Golang技术栈

时间:2023-04-14 17:41:26 467浏览 收藏

编程并不是一个机械性的工作,而是需要有思考,有创新的工作,语法是固定的,但解决问题的思路则是依靠人的思维,这就需要我们坚持学习和更新自己的知识。今天golang学习网就整理分享《在 Go 中打印 bytes.Buffer 时的不同行为》,文章讲解的知识点主要包括golang,如果你对Golang方面的知识点感兴趣,就不要错过golang学习网,在这可以对大家的知识积累有所帮助,助力开发能力的提升。

问题内容

当我执行这个:

buf := new(bytes.Buffer)
buf.WriteString("Hello world")
fmt.Println(buf)

它打印Hello World

但是如果我执行这个:

var buf bytes.Buffer
buf.WriteString("Hello world")
fmt.Println(buf)

它打印:{[72 101 108 108 111 32 119 111 114 108 100] 0 [72 101 108 108 111 32 119 111 114 108 100 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] 0}

我知道这是结构byte.Buffer的内容,但为什么它以不同的格式打印?

正确答案

因为类型的值*bytes.Buffer有一个String()方法(方法集包含方法),而类型的值*bytes.Buffer没有。String()``bytes.Buffer

并且fmt包检查正在打印的值是否有String() string方法,如果有,则调用它来生成该值的字符串表示形式。

引用包文档fmt

除了使用动词 %T 和 %p 打印时,特殊格式注意事项适用于实现某些接口的操作数。按申请顺序:

  1. 如果操作数是 reflect.Value,则操作数被它所持有的具体值替换,并继续打印下一条规则。

  2. 如果一个操作数实现了 Formatter 接口,它将被调用。Formatter 提供了对格式化的精细控制。

  3. 如果 %v 动词与 # 标志 (%#v) 一起使用并且操作数实现了 GoStringer 接口,则会调用该接口。

如果格式(对于 Println 等隐含 %v)对字符串(%s %q %v %x %X)有效,则适用以下两条规则:

  1. 如果操作数实现了错误接口,则会调用 Error 方法将对象转换为字符串,然后根据动词(如果有)的要求对字符串进行格式化。

  2. 如果操作数实现方法 String() 字符串,则将调用该方法将对象转换为字符串,然后根据动词(如果有)的要求对其进行格式化。

Buffer.String()方法将其内容作为 a 返回string,这就是您在传递 type 的指针时看到的打印内容*bytes.Buffer。当你传递一个非指针类型的值时bytes.Buffer,它就像一个普通的结构值一样简单地打印出来,默认格式是:

{field0 field1 ...}

请参阅相关/类似问题:

[t 和 *t 的区别](https://stackoverflow.com/questions/43065856/the-difference- between-t-and-t/43065979#43065979)

[为什么不使用 %v 打印 int 和 string](https://stackoverflow.com/questions/41159169/why- not-use-v-to-print-int-and-string/41159231#41159231)

[为什么 Error() 优先于 String()](https://stackoverflow.com/questions/30159980/why- does-error-have-priority-over-string/30160112#30160112)

本篇关于《在 Go 中打印 bytes.Buffer 时的不同行为》的介绍就到此结束啦,但是学无止境,想要了解学习更多关于Golang的相关知识,请关注golang学习网公众号!

声明:本文转载于:Golang技术栈 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>
评论列表