ホームページ >バックエンド開発 >Golang >Go で「bytes.Buffer」を出力すると、それがポインタであるかどうかに応じて異なる出力が生成されるのはなぜですか?

Go で「bytes.Buffer」を出力すると、それがポインタであるかどうかに応じて異なる出力が生成されるのはなぜですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-11-26 05:04:09286ブラウズ

Why Does Printing a `bytes.Buffer` in Go Produce Different Output Depending on Whether It's a Pointer or Not?

Go での bytes.Buffer の出力の異なる動作

Go では、bytes.Buffer 型の値を出力する動作は、ポインター値か非ポインター値かに関係なく。

次のコードを考えてみましょう。例:

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

この場合、* 演算子を使用してバッファ ポインターを逆参照すると、bytes.Buffer 型の String() メソッドが呼び出されます。このメソッドはバッファの内容の文字列表現を返し、その結果「Hello World」が出力されます。

次に、コードを次のように変更してみましょう。

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

* 演算子を使用せずに、 bytes.Buffer 型の非ポインター値を渡しています。前の例とは異なり、この場合、fmt パッケージは String() メソッドを呼び出しません。代わりに、デフォルトの書式設定を使用して、バッファを構造体値として出力します。

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

この出力は、バッファを裏付けるスライス、長さおよび容量フィールドを含む、bytes.Buffer の内部構造を表します。

これら 2 つの例の主な違いは、String() メソッドにあります。 *bytes.Buffer 型の値を出力する場合、fmt パッケージは String() メソッドを利用してバッファーの内容の文字列表現を取得します。 bytes.Buffer 型の非ポインター値にはこのメソッドがないため、デフォルトの構造体フォーマットが使用されます。

以上がGo で「bytes.Buffer」を出力すると、それがポインタであるかどうかに応じて異なる出力が生成されるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。