ホームページ > バックエンド開発 > Golang > Go で「bytes.Buffer」を出力すると、文字列の内容が表示されることもあれば、その内部表現が表示されることもあるのはなぜですか?

Go で「bytes.Buffer」を出力すると、文字列の内容が表示されることもあれば、その内部表現が表示されることもあるのはなぜですか?

DDD
リリース: 2024-12-13 10:28:26
オリジナル
197 人が閲覧しました

Why does printing a `bytes.Buffer` in Go sometimes show the string content and sometimes show its internal representation?

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート