Golang Go语言中“var buf bytes.Buffer" 和"buf := new(bytes.Buffer)" 有区别吗

发布于 1周前 作者 caililin 来自 Go语言

null
Golang Go语言中“var buf bytes.Buffer" 和"buf := new(bytes.Buffer)" 有区别吗

5 回复

写个 sample 就能理解的东西,老铁。。

https://play.golang.org/p/GfTLtc-RM3-

更多关于Golang Go语言中“var buf bytes.Buffer" 和"buf := new(bytes.Buffer)" 有区别吗的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


写 var buf bytes.Buffer,使用时应当使用&buf,才是正确的类型

由于编译器会自动推断,调用结构体的函数时相当于自动加上了&,等同 buf :=&(bytes.Buffer),也等同 new(bytes.Buffer)

但如果一个函数要求传入*bytes.Buffer 作为参数,比如 func (b *bytes.Buffer),那前者的 buf 传入函数时会报类型不匹配的错误。如果函数要求传入一个符合某 interface 的值,比如 func (w io.Writer),*bytes.Buffer 实现了该 interface 但 bytes.Buffer 未实现,前者同样不能传入。

&bytes.Buffer{}
脑子不清醒了…

类型不一样

在Go语言中,var buf bytes.Bufferbuf := new(bytes.Buffer) 这两种方式确实都可以用来初始化一个 bytes.Buffer 类型的变量,但它们有一些细微的区别,主要体现在变量的声明和分配内存的方式上。

  1. var buf bytes.Buffer

    • 这种方式是显式的变量声明,它首先声明了一个 bytes.Buffer 类型的变量 buf,然后自动调用该类型的零值构造函数进行初始化。对于 bytes.Buffer 来说,零值就是一个空的缓冲区。
    • 这种方式在编译时就确定了变量的类型和名称,有助于代码的清晰性和可读性。
  2. buf := new(bytes.Buffer)

    • new 函数是Go语言的一个内置函数,用于分配内存。new(T) 会为 T 类型的新项分配零值的内存,并返回一个指向它的指针。
    • 因此,buf := new(bytes.Buffer) 实际上创建了一个指向 bytes.Buffer 零值的指针,并将这个指针赋值给变量 buf。注意,这里的 buf 是一个指针类型 *bytes.Buffer

总结来说,两者在功能上等价,都能初始化一个空的 bytes.Buffer 实例。主要区别在于,第一种方式声明的是一个值类型的变量,而第二种方式声明的是一个指向 bytes.Buffer 的指针。选择哪种方式取决于你的具体需求和代码风格。

回到顶部