Я пытаюсь реализовать io.Writer в каком-либо объекте Go, но записывает его в строку, а не в файл или файловый объект. Думал 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)
Я смущен, так как он четко реализует интерфейс. Как мне исправить эту ошибку?
Ответы:
Передайте указатель на буфер вместо самого буфера:
import "bufio" import "bytes" func main() { var b bytes.Buffer foo := bufio.NewWriter(&b) }
источник
package main import "bytes" import "io" func main() { var b bytes.Buffer _ = io.Writer(&b) }
Вам не нужно использовать bufio.NewWriter (& b) для создания io.Writer. & b - это сам io.Writer.
источник
Просто используйте
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)
Некоторые идеи, использовать Go
Passed by value
, если мы переходимb
кbuffio.NewWriter()
, в NewWriter (), это новыйb
(новый буфер), а не исходный буфер мы определили, поэтому нужно передать адрес&b
.Снова добавить, bytes.Buffer определен:
type Buffer struct { buf []byte // contents are the bytes buf[off : len(buf)] off int // read at &buf[off], write at &buf[len(buf)] bootstrap [64]byte // memory to hold first slice; helps small buffers avoid allocation. lastRead readOp // last read operation, so that Unread* can work correctly. }
при использовании
passed by value
, переданная новая структура буфера отличается от переменной исходного буфера.источник