不同打印输出的奇怪情况:*bytes.Buffer 与 bytes.Buffer
在 Go 中使用字节时,了解指针和非指针值之间的细微差别可能会导致意外的打印结果。
当您执行以下命令时代码:
buf := new(bytes.Buffer) buf.WriteString("Hello World") fmt.Println(buf)
您会得到熟悉的输出:“Hello World”。这是因为,对于像 *bytes.Buffer 这样的指针值,Go 会检查该值是否具有 String() 方法。在这种情况下, *bytes.Buffer 实现了 String(),并且它的调用会导致缓冲区的内容被打印为字符串。
但是,对于像 bytes.Buffer 这样的非指针值执行相同的代码,其行为会有所不同:
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
这看似神秘的输出表示 bytes.Buffer 结构的内存布局,包括其字段和填充字节。
造成这种差异的原因在于 Go 处理值打印的方式。它检查正在打印的值是否具有 String() 方法,如果是,则使用它来获取字符串表示形式。对于指针类型 *bytes.Buffer,存在 String() 方法,因此其内容被打印为字符串。然而,对于非指针类型 bytes.Buffer,未实现 String() 方法,导致其各个字段的默认格式。
记住这种区别很重要,以避免在工作时出现意外Go 中的字节和缓冲区。了解指针和非指针值的不同行为将帮助您编写更可预测和更健壮的代码。
以上是为什么 Go 中的'fmt.Println”为'*bytes.Buffer”和'bytes.Buffer”显示不同的输出?的详细内容。更多信息请关注PHP中文网其他相关文章!