Maison > Article > développement back-end > Pourquoi l'impression d'un « bytes.Buffer » dans Go produit-elle une sortie différente selon qu'un pointeur ou une valeur est utilisé ?
Comportement différent lors de l'impression d'un octet.Buffer en Go
En Go, lors de l'impression d'un octet.Buffer en utilisant fmt.Println(), le comportement peut varier selon que vous utilisez un pointeur vers un bytes.Buffer ou la valeur directement. Voici une explication :
Dans le premier exemple :
buf := new(bytes.Buffer) buf.WriteString("Hello world") fmt.Println(buf)
buf est un pointeur vers un bytes.Buffer, ce qui signifie qu'il a une méthode String() disponible. Lorsque vous passez un pointeur vers fmt.Println(), la méthode String() est appelée automatiquement, ce qui convertit le contenu de bytes.Buffer en chaîne. C'est pourquoi vous voyez « Hello World » imprimé.
Dans le deuxième exemple :
var buf bytes.Buffer buf.WriteString("Hello world") fmt.Println(buf)
buf est une valeur de type bytes.Buffer, pas un pointeur. Par conséquent, la méthode String() n'est pas disponible pour cette valeur. Au lieu de cela, fmt.Println() l'imprime comme une valeur de structure normale, en utilisant le format par défaut {field0 field1 ...}. Les champs ici sont les octets stockés dans le tampon, représentés comme une tranche d'entiers.
Pour toujours imprimer le contenu d'un octet.Buffer sous forme de chaîne, que vous utilisiez un pointeur ou une valeur, vous pouvez appelez explicitement la méthode String() avant d'imprimer :
fmt.Println(buf.String())
Cela garantira un comportement cohérent dans les deux cas.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!