Ich versuche, ein Go-Objekt io.Writer implementieren zu lassen, schreibe aber in eine Zeichenfolge anstelle einer Datei oder eines dateiähnlichen Objekts. Ich dachte, es bytes.Buffer
würde funktionieren, da es implementiert wird Write(p []byte)
. Wenn ich dies jedoch versuche:
import "bufio"
import "bytes"
func main() {
var b bytes.Buffer
foo := bufio.NewWriter(b)
}
Ich erhalte folgende Fehlermeldung:
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)
Ich bin verwirrt, da es die Schnittstelle klar implementiert. Wie behebe ich diesen Fehler?
Antworten:
Übergeben Sie anstelle des Puffers selbst einen Zeiger auf den Puffer:
quelle
Sie müssen "bufio.NewWriter (& b)" nicht verwenden, um einen io.Writer zu erstellen. & b ist ein io.Writer selbst.
quelle
Benutz einfach
foo := bufio.NewWriter(&b)
Weil die Art und Weise, wie bytes.Buffer io.Writer implementiert, ist
Es ist
b *Buffer
nichtb Buffer
. (Ich finde es auch seltsam, dass wir eine Methode über eine Variable oder ihren Zeiger aufrufen können, aber wir können einer Variablen ohne Zeiger keinen Zeiger zuweisen.)Außerdem ist die Compiler-Eingabeaufforderung nicht klar genug:
bytes.Buffer does not implement io.Writer (Write method has pointer receiver)
Einige Ideen, Go Gebrauch
Passed by value
, wenn wir passierenb
zubuffio.NewWriter()
, in NewWriter (), ist es ein neuerb
(ein neuer Puffer), nicht der ursprüngliche Puffer wir definierten, damit wir die Adresse übergeben müssen&b
.Erneut anhängen, Bytes.Buffer ist definiert:
Bei Verwendung
passed by value
unterscheidet sich die übergebene neue Pufferstruktur von der Ursprungspuffervariablen.quelle