Heim  >  Artikel  >  Backend-Entwicklung  >  Warum zeigt „fmt.Println' in Go unterschiedliche Ausgaben für „*bytes.Buffer' und „bytes.Buffer' an?

Warum zeigt „fmt.Println' in Go unterschiedliche Ausgaben für „*bytes.Buffer' und „bytes.Buffer' an?

Susan Sarandon
Susan SarandonOriginal
2024-11-22 14:20:34333Durchsuche

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

Der seltsame Fall verschiedener Druckausgaben: *bytes.Buffer vs. bytes.Buffer

Bei der Arbeit mit Bytes in Go ist das Verständnis der Feine Unterschiede zwischen Zeiger- und Nicht-Zeigerwerten können zu unerwarteten Druckergebnissen führen.

Wenn Sie Folgendes ausführen Code:

buf := new(bytes.Buffer)
buf.WriteString("Hello World")
fmt.Println(buf)

Sie erhalten die bekannte Ausgabe: „Hello World“. Dies liegt daran, dass Go bei Zeigerwerten wie *bytes.Buffer prüft, ob der Wert über eine String()-Methode verfügt. In diesem Fall implementiert *bytes.Buffer String() und sein Aufruf führt dazu, dass der Inhalt des Puffers als Zeichenfolge gedruckt wird.

Derselbe Code, der für Nicht-Zeigerwerte wie bytes.Buffer ausgeführt wird, verhält sich jedoch anders :

var buf bytes.Buffer
buf.WriteString("Hello World")
fmt.Println(buf)

Anstelle der erwarteten String-Darstellung erhalten Sie die folgende Ausgabe:

{[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

Dies scheinbar Die kryptische Ausgabe stellt das Speicherlayout der bytes.Buffer-Struktur dar, einschließlich ihrer Felder und Füllbytes.

Der Grund für diesen Unterschied liegt in der Art und Weise, wie Go mit dem Drucken von Werten umgeht. Es prüft, ob der auszugebende Wert über eine String()-Methode verfügt und verwendet diese, wenn ja, um eine String-Darstellung zu erhalten. Für den Zeigertyp *bytes.Buffer ist die Methode String() vorhanden und daher wird ihr Inhalt als String ausgegeben. Für den Nicht-Zeiger-Typ bytes.Buffer ist die String()-Methode jedoch nicht implementiert, was zur Standardformatierung seiner einzelnen Felder führt.

Es ist wichtig, diese Unterscheidung im Hinterkopf zu behalten, um Überraschungen bei der Arbeit zu vermeiden mit Bytes und Puffern in Go. Wenn Sie das unterschiedliche Verhalten von Zeiger- und Nicht-Zeigerwerten verstehen, können Sie vorhersehbareren und robusteren Code schreiben.

Das obige ist der detaillierte Inhalt vonWarum zeigt „fmt.Println' in Go unterschiedliche Ausgaben für „*bytes.Buffer' und „bytes.Buffer' an?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn