Estou tentando fazer com que algum objeto Go implemente io.Writer, mas grava em uma string em vez de um arquivo ou objeto semelhante a um arquivo. Achei bytes.Buffer
que funcionaria, uma vez que implementa Write(p []byte)
. No entanto, quando tento isso:
import "bufio"
import "bytes"
func main() {
var b bytes.Buffer
foo := bufio.NewWriter(b)
}
Estou tendo o erro a seguir:
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)
Estou confuso, pois claramente implementa a interface. Como faço para resolver esse erro?
Respostas:
Passe um ponteiro para o buffer, em vez do próprio buffer:
fonte
Você não precisa usar "bufio.NewWriter (& b)" para criar um io.Writer. & b é o próprio io.Writer.
fonte
Apenas use
foo := bufio.NewWriter(&b)
Porque a forma como bytes.Buffer implementa io.Writer é
É
b *Buffer
, nãob Buffer
. (Também acho estranho porque podemos chamar um método por uma variável ou seu ponteiro, mas não podemos atribuir um ponteiro a uma variável do tipo não ponteiro.)Além disso, o prompt do compilador não é claro o suficiente:
bytes.Buffer does not implement io.Writer (Write method has pointer receiver)
Algumas idéias, vá usar
Passed by value
, se passarmosb
parabuffio.NewWriter()
, em NewWriter (), é um novob
(um novo buffer), não o buffer original que definimos, portanto precisamos passar o endereço&b
.Anexe novamente, bytes.Buffer é definido:
usando
passed by value
, a nova estrutura de buffer passada é diferente da variável de buffer de origem.fonte