Go で bytes.Buffer を印刷するときの異なる動作
bytes.Buffer 型を使用すると、オブジェクトを印刷するときにユーザーが異なる動作に遭遇する可能性がありますそのタイプの。次のコード:
buf := new(bytes.Buffer) buf.WriteString("Hello world") fmt.Println(buf)
は「Hello World」を出力しますが、このコード:
var buf bytes.Buffer buf.WriteString("Hello world") fmt.Println(buf)
は次の内容を出力します:
{[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 型の String() メソッドの存在。 bytes.Buffer 型の値を出力する場合、String() メソッドが呼び出され、値の文字列表現が生成されます。ただし、bytes.Buffer 型の値を出力する場合、そのようなメソッドは使用できず、構造体のデフォルト形式が使用され、その結果、上記のような表現になります。
動作の違いについては、次のセクションでさらに説明します。以下:
type MyBuffer bytes.Buffer func (b *MyBuffer) String() string { return "MyBuffer with " + b.String() } var b MyBuffer b.WriteString("Hello world") fmt.Println(b)
この場合、MyBuffer 値が出力されると、カスタム String() メソッドが呼び出され、「MyBuffer with ...」プレフィックスが出力。String() メソッドを実装した効果を示します。
Go で bytes.Buffer 型を操作する場合、この動作を理解することが重要です。出力の書式設定に影響し、そうでない場合は予期しない結果が生じる可能性があるためです。適切に処理されます。
以上がGo で「bytes.Buffer」を出力すると、文字列の内容が表示されることもあれば、その内部表現が表示されることもあるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。