De la “octets.Tampon de ne pas mettre en œuvre io.Écrivain” message d'erreur
J'essaie d'avoir certains Vont objet de mettre en œuvre io.Écrivain, mais écrit d'une chaîne de caractères au lieu d'un fichier ou de fichiers objet. J'ai pensé bytes.Buffer
fonctionnerait car elle met en œuvre Write(p []byte)
. Cependant lorsque j'essaye ceci:
import "bufio"
import "bytes"
func main() {
var b bytes.Buffer
foo := bufio.NewWriter(b)
}
J'obtiens l'erreur suivante:
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)
Je suis confus, car il clairement implémente l'interface. Comment puis-je résoudre ce problème?
- J'ai rencontré ce problème au moins deux fois, et à Googler pour une solution était vraiment inutile.
- Notez que la création d'un bufio n'est pas nécessaire. Juste utiliser &b, comme un oi.Auteur
Vous devez vous connecter pour publier un commentaire.
Passer un pointeur vers le tampon, au lieu de la mémoire tampon:
Vous n'avez pas besoin d'utiliser "bufio.NewWriter(&b)" pour créer un io.De l'écrivain. &b est un io.L'écrivain lui-même.
Suffit d'utiliser
foo := bufio.NewWriter(&b)
Parce que la façon dont octets.Tampon implémente io.L'écrivain est
C'est
b *Buffer
, pasb Buffer
. (Je pense aussi que c'est bizarre qu'on peut appeler une méthode par une variable ou d'un pointeur, mais on ne peut pas affecter un pointeur vers un non-variable de type pointeur.)En outre, le compilateur invite n'est pas assez clair:
bytes.Buffer does not implement io.Writer (Write method has pointer receiver)
Quelques idées, Allez utiliser
Passed by value
, si l'on fait passerb
àbuffio.NewWriter()
, dans NewWriter(), c'est une nouvelleb
(un nouveau tampon), pas le tampon d'origine, nous avons défini, donc nous avons besoin de passer l'adresse&b
.Ajouter de nouveau, en octets.Tampon est définie:
à l'aide de
passed by value
, le passé à nouveau tampon structure est différente de l'origine de la mémoire tampon variable.