我正在尝试让一些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)
我很困惑,因为它清楚地实现了界面。如何解决此错误?
答案 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
。