Solo usa
foo := bufio.NewWriter(&b)
Porque la forma en que bytes.Buffer implementa io.Writer es
func (b *Buffer) Write(p []byte) (n int, err error) {
...
}
// io.Writer definition
type Writer interface {
Write(p []byte) (n int, err error)
}
Es b *Buffer
, no b Buffer
. (También creo que es extraño porque podemos llamar a un método mediante una variable o su puntero, pero no podemos asignar un puntero a una variable de tipo que no sea puntero).
Además, el indicador del compilador no es lo suficientemente claro:
bytes.Buffer does not implement io.Writer (Write method has pointer receiver)
Algunas ideas, ve a usar Passed by value
, si pasamos b
a buffio.NewWriter()
, en NewWriter (), es un nuevo b
(un nuevo búfer), no el búfer original que definimos, por lo tanto, necesitamos pasar la dirección &b
.
Adjuntar de nuevo, bytes.Buffer está definido:
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.
}
usando passed by value
, la nueva estructura de búfer pasada es diferente de la variable de búfer de origen.