Estoy tratando de que algún objeto Go implemente io.Writer, pero escribe en una cadena en lugar de un archivo o un objeto similar a un archivo. Pensé bytes.Buffer
que funcionaría ya que se implementa Write(p []byte)
. Sin embargo, cuando intento esto:
import "bufio"
import "bytes"
func main() {
var b bytes.Buffer
foo := bufio.NewWriter(b)
}
Obtuve el siguiente error:
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)
Estoy confundido, ya que claramente implementa la interfaz. ¿Cómo resuelvo este error?
Respuestas:
Pase un puntero al búfer, en lugar del búfer en sí:
fuente
No es necesario utilizar "bufio.NewWriter (& b)" para crear un io.Writer. & b es un escritor io.Writer.
fuente
Solo usa
foo := bufio.NewWriter(&b)
Porque la forma en que bytes.Buffer implementa io.Writer es
Es
b *Buffer
, nob 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 pasamosb
abuffio.NewWriter()
, en NewWriter (), es un nuevob
(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:
usando
passed by value
, la nueva estructura de búfer pasada es diferente de la variable de búfer de origen.fuente