Próbuję mieć jakiś obiekt Go zaimplementować io.Writer, ale zapisuje do ciągu zamiast do pliku lub obiektu podobnego do pliku. Pomyślałem, że bytes.Buffer
będzie działać, ponieważ wdraża Write(p []byte)
. Jednak kiedy próbuję tego:
import "bufio"
import "bytes"
func main() {
var b bytes.Buffer
foo := bufio.NewWriter(b)
}
Otrzymuję następujący błąd:
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)
Jestem zdezorientowany, ponieważ wyraźnie implementuje interfejs. Jak rozwiązać ten błąd?
Odpowiedzi:
Przekaż wskaźnik do bufora zamiast do samego bufora:
import "bufio" import "bytes" func main() { var b bytes.Buffer foo := bufio.NewWriter(&b) }
źródło
package main import "bytes" import "io" func main() { var b bytes.Buffer _ = io.Writer(&b) }
Nie musisz używać „bufio.NewWriter (& b)”, aby utworzyć io.Writer. & b jest samym io.Writer.
źródło
Po prostu użyj
foo := bufio.NewWriter(&b)
Ponieważ sposób bytes.Buffer implementuje io.Writer jest
func (b *Buffer) Write(p []byte) (n int, err error) { ... } // io.Writer definition type Writer interface { Write(p []byte) (n int, err error) }
To
b *Buffer
nie jestb Buffer
. (Myślę też, że to dziwne, ponieważ możemy wywołać metodę za pomocą zmiennej lub jej wskaźnika, ale nie możemy przypisać wskaźnika do zmiennej typu niebędącego wskaźnikiem).Poza tym zachęta kompilatora nie jest wystarczająco jasna:
bytes.Buffer does not implement io.Writer (Write method has pointer receiver)
Niektóre pomysły, używają Go
Passed by value
, jeśli przejdziemyb
dobuffio.NewWriter()
, w NewWriter (), jest to nowyb
(nowy bufor), a nie oryginalny bufor, który zdefiniowaliśmy, dlatego musimy przekazać adres&b
.Dodaj ponownie, bajty. Zdefiniowany jest bufor:
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. }
using
passed by value
, przekazana nowa struktura bufora różni się od zmiennej bufora pochodzenia.źródło