我正在尝试使用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中的每个结构一样。