J'essaie d'avoir un objet Go implémente io.Writer, mais écrit dans une chaîne au lieu d'un fichier ou d'un objet semblable à un fichier. Je pensais que bytes.Buffer
cela fonctionnerait car il implémente Write(p []byte)
. Cependant, quand 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 implémente clairement l'interface. Comment résoudre cette erreur?
Réponses:
Passez un pointeur vers le tampon, au lieu du tampon lui-même:
la source
Vous n'avez pas besoin d'utiliser "bufio.NewWriter (& b)" pour créer un io.Writer. & b est un io.Writer lui-même.
la source
Juste utiliser
foo := bufio.NewWriter(&b)
Parce que la façon dont bytes.Buffer implémente io.Writer est
Ça ne l'est
b *Buffer
pasb Buffer
. (Je pense aussi que c'est bizarre car nous pouvons appeler une méthode par une variable ou son pointeur, mais nous ne pouvons pas affecter un pointeur à une variable de type non pointeur.)De plus, l'invite du compilateur n'est pas assez claire:
bytes.Buffer does not implement io.Writer (Write method has pointer receiver)
Quelques idées, allez utiliser
Passed by value
, si nous passonsb
àbuffio.NewWriter()
, dans NewWriter (), c'est un nouveaub
(un nouveau tampon), pas le tampon d'origine que nous avons défini, donc nous devons passer l'adresse&b
.Ajoutez à nouveau, octets.Buffer est défini:
en utilisant
passed by value
, la nouvelle structure de tampon passée est différente de la variable de tampon d'origine.la source