Maison > développement back-end > Golang > Pourquoi « fmt.Println » affiche-t-il des sorties différentes pour « *bytes.Buffer » et « bytes.Buffer » dans Go ?

Pourquoi « fmt.Println » affiche-t-il des sorties différentes pour « *bytes.Buffer » et « bytes.Buffer » dans Go ?

Susan Sarandon
Libérer: 2024-11-22 14:20:34
original
405 Les gens l'ont consulté

Why Does `fmt.Println` Show Different Outputs for `*bytes.Buffer` and `bytes.Buffer` in Go?

Le cas curieux de différentes sorties d'impression : *bytes.Buffer vs. bytes.Buffer

Lorsque vous travaillez avec des octets dans Go, comprendre le des différences subtiles entre les valeurs de pointeur et celles sans pointeur peuvent conduire à des résultats d'impression inattendus.

Lorsque vous exécutez ce qui suit code :

buf := new(bytes.Buffer)
buf.WriteString("Hello World")
fmt.Println(buf)
Copier après la connexion

Vous obtenez le résultat familier : "Hello World". En effet, pour les valeurs de pointeur telles que *bytes.Buffer, Go vérifie si la valeur a une méthode String(). Dans ce cas, *bytes.Buffer implémente String(), et son invocation entraîne l'impression du contenu du tampon sous forme de chaîne.

Cependant, le même code exécuté pour les valeurs non-pointeurs comme bytes.Buffer se comporte différemment :

var buf bytes.Buffer
buf.WriteString("Hello World")
fmt.Println(buf)
Copier après la connexion

Au lieu de la représentation sous forme de chaîne attendue, vous obtenez le résultat suivant :

{[72 101 108 108 111 32 119 111 114 108 100] 0 [72 101 108 108 111 32 119 111 114 108 100 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]} 0
Copier après la connexion

Cela semble La sortie cryptique représente la disposition de la mémoire de la structure bytes.Buffer, y compris ses champs et ses octets de remplissage.

La raison de cette différence réside dans la façon dont Go gère l'impression des valeurs. Il vérifie si la valeur en cours d'impression a une méthode String() et, si c'est le cas, l'utilise pour obtenir une représentation sous forme de chaîne. Pour le type de pointeur *bytes.Buffer, la méthode String() est présente et son contenu est donc imprimé sous forme de chaîne. Pour le type bytes.Buffer sans pointeur, cependant, la méthode String() n'est pas implémentée, ce qui conduit au formatage par défaut de ses champs individuels.

Il est important de garder cette distinction à l'esprit pour éviter les surprises lors du travail. avec des octets et des tampons en Go. Comprendre les différents comportements des valeurs de pointeur et de non-pointeur vous aidera à écrire un code plus prévisible et plus robuste.

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal