我正在尝试使用Buffer包并从Buffer文档中复制以下代码。
package main
import (
"bytes"
"fmt"
"os"
)
func main() {
var b bytes.Buffer // A Buffer needs no initialization.
b.Write([]byte("Hello "))
fmt.Fprintf(&b, "world!")
b.WriteTo(os.Stdout)
}
为什么Buffer在这里,不要初始化?
答案 0 :(得分:4)
正如您所看到的那样here缓冲区只包含一些整数,buf切片和一些数组。所有这些都不需要初始化,因为go有zero values。
您可以阅读有关切片和数组及其工作方式的更多信息here。
答案 1 :(得分:2)
它已初始化。如果没有专门初始化变量,go会将其初始化为zero value。这意味着bytes.Buffer
的所有内部字段的值都为0,或相似类型的相似值(例如指针为nil)。
作者然后实现了bytes.Buffer
所以所有值都是0是一个有意义的起点(它意味着an empty buffer),所以程序员不需要显式初始化它以便开始使用缓冲液中。
答案 2 :(得分:0)
这是因为当您调用Fprintf
方法时,bytes.Buffer.Write
方法被隐含地调用,并且根据doc:
Write将p的内容附加到缓冲区,根据需要增加缓冲区。
如果查看源代码,Write
会调用grow函数:func (b *Buffer) grow(n int) int
。
此函数识别缓冲区为空,因为它假定空缓冲区的内部字段值为0,这实际上是默认情况下bytes.Buffer
结构的初始化方式,就像go中的每个结构一样。