为什么struct buffer不需要初始化

时间:2014-07-26 14:56:05

标签: go

我正在尝试使用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在这里,不要初始化?

3 个答案:

答案 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中的每个结构一样。