获取“bytes.Buffer不实现io.Writer”错误消息

时间:2014-05-04 10:06:10

标签: go

我正在尝试让一些Go对象实现io.Writer,但是写入字符串而不是文件或类文件对象。我认为bytes.Buffer可以正常工作,因为它实现了Write(p []byte)。但是当我尝试这个时:

import "bufio"
import "bytes"

func main() {
    var b bytes.Buffer
    foo := bufio.NewWriter(b)
}

我收到以下错误:

cannot use b (type bytes.Buffer) as type io.Writer in function argument:
bytes.Buffer does not implement io.Writer (Write method has pointer receiver)

我很困惑,因为它清楚地实现了界面。如何解决此错误?

3 个答案:

答案 0 :(得分:114)

将指针传递给缓冲区,而不是缓冲区本身:

import "bufio"
import "bytes"

func main() {
    var b bytes.Buffer
    foo := bufio.NewWriter(&b)
}

答案 1 :(得分:11)

package main

import "bytes"
import "io"

func main() {
    var b bytes.Buffer
    _ = io.Writer(&b)
}

你不需要使用" bufio.NewWriter(& b)"创建一个io.Writer。 & b是一个io.Writer本身。

答案 2 :(得分:2)

只需使用

foo := bufio.NewWriter(&b)

因为bytes.Buffer实现io.Writer的方式是

func (b *Buffer) Write(p []byte) (n int, err error) {
    ...
}
// io.Writer definition
type Writer interface {
    Write(p []byte) (n int, err error)
}

它是b *Buffer,而不是b Buffer。 (我也认为这很奇怪,因为我们可以通过变量或其指针来调用方法,但是不能将指针分配给非指针类型的变量。)

此外,编译器提示不够清楚:

bytes.Buffer does not implement io.Writer (Write method has pointer receiver)


有些想法,请使用Passed by value,如果我们将b传递给buffio.NewWriter(),则在NewWriter()中,它是一个新的b(一个新的缓冲区),而不是我们定义的原始缓冲区,因此我们需要传递地址&b