为什么不需要初始化结构缓冲区



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

正如您在这里看到的,Buffer仅由一些整型、但是切片和一些数组组成。它们都不需要初始化,因为go有零值。

你可以在这里阅读更多关于切片和数组以及它们是如何工作的。

已初始化。当您没有特别初始化一个变量时,go会将其初始化为零值。这意味着bytes.Buffer的所有内部字段的值都是0,或者类似于相关类型(例如指针为nil)。

作者随后实现了bytes.Buffer,所以所有的值都是0是一个有意义的起点(它意味着一个空的缓冲区),所以程序员不需要显式地初始化它,以便开始使用缓冲区。

这是因为当您调用Fprintf方法时,会隐式调用bytes.Buffer.Write方法,并且根据文档:

Write将p的内容追加到缓冲区,并根据需要增加缓冲区。

如果您查看源代码,Write调用增长函数:func (b *Buffer) grow(n int) int .

该函数识别缓冲区为空,因为它假设空缓冲区的内部字段为0,这实际上是bytes.Buffer结构在默认情况下初始化的方式,就像go中的每个结构一样。

最新更新