英文:
Why struct buffer do not need to initialize
问题
我正在尝试使用Buffer包,并从Buffer文档中复制以下代码。
package main
import (
"bytes"
"fmt"
"os"
)
func main() {
var b bytes.Buffer // Buffer不需要初始化。
b.Write([]byte("Hello "))
fmt.Fprintf(&b, "world!")
b.WriteTo(os.Stdout)
}
为什么这里的Buffer不需要初始化?
英文:
I am trying to use Buffer package and copy the following code from Buffer documentation.
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)
}
Why do Buffer here, not to be initialize?
答案1
得分: 4
你可以在这里看到,Buffer只包含一些整数、buf切片和一些数组。它们都不需要初始化,因为Go语言有零值。
你可以在这里了解更多关于切片和数组以及它们的工作原理的信息。
英文:
As you can see here Buffer consists just of some ints, the buf slice and some arrays. All of them need no initialization, since go has zero values.
You can read more about slices and arrays and how they work here.
答案2
得分: 2
它已经初始化。当您没有明确初始化一个变量时,Go语言会将其初始化为其零值。这意味着bytes.Buffer
的所有内部字段都会被赋值为0,或者对于相关类型来说是类似的值(例如指针的nil值)。
然后,作者们实现了bytes.Buffer
,使得所有值都为0成为一个有意义的起始点(这意味着一个空缓冲区),因此程序员在开始使用缓冲区时不需要显式地初始化它。
英文:
It is initialized. When you do not specifically initialize a variable, go will initialize it to its zero value. That means all the internal fields of a bytes.Buffer
gets the value 0, or similar for the relevant types (e.g. nil for pointers).
The authors then implemented bytes.Buffer
so all values being 0 is a meaningful starting point(It means an empty buffer), so programmers doesn't need to explicitly initialize it in order to start using a Buffer.
答案3
得分: 0
这是因为当你调用Fprintf
方法时,隐式地调用了bytes.Buffer.Write
方法,根据文档的说明:
> Write将p的内容附加到缓冲区,根据需要扩展缓冲区。
如果你查看源代码,Write
方法调用了grow函数:func (b *Buffer) grow(n int) int
。
这个函数会判断缓冲区是否为空,因为它假设一个空的缓冲区在内部字段上有0值,这实际上是bytes.Buffer
结构的默认初始化方式,就像Go语言中的每个结构体一样。
英文:
This due to the fact that when you call the Fprintf
method, the bytes.Buffer.Write
method is implicitely called, and as per the doc:
> Write appends the contents of p to the buffer, growing the buffer as needed.
If you look at the source code, Write
calls the grow function: func (b *Buffer) grow(n int) int
.
This function recognizes that the buffer is empty, because it assumes that an empty buffer has 0 values for its internal fields, which is actually how a bytes.Buffer
structure is initialized by default, just like every structure in go.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论