Go での bytes.Buffer の印刷の異なる動作
Go では、fmt.Println() を使用して bytes.Buffer を印刷するときに、動作は、bytes.Buffer へのポインターを使用するか、値を直接使用するかによって異なる場合があります。説明は次のとおりです。
最初の例では、
buf := new(bytes.Buffer) buf.WriteString("Hello world") fmt.Println(buf)
buf は bytes.Buffer へのポインターであり、使用可能な String() メソッドがあることを意味します。ポインタを fmt.Println() に渡すと、String() メソッドが自動的に呼び出され、bytes.Buffer の内容が文字列に変換されます。これが、「Hello World」が出力される理由です。
2 番目の例では、
var buf bytes.Buffer buf.WriteString("Hello world") fmt.Println(buf)
buf は、ポインタではなく bytes.Buffer 型の値です。そのため、この値には String() メソッドを使用できません。代わりに、 fmt.Println() は、デフォルトの形式 {field0 field1 ...} を使用して、通常の構造体の値として出力します。ここでのフィールドは、バッファに格納されているバイトであり、整数のスライスとして表されます。
ポインタを使用するか値を使用するかに関係なく、常に bytes.Buffer の内容を文字列として出力するには、次のことができます。印刷する前に String() メソッドを明示的に呼び出します:
fmt.Println(buf.String())
これにより、どちらの場合でも一貫した動作が保証されます。
以上がGo で「bytes.Buffer」を出力すると、ポインターが使用されるか値が使用されるかによって異なる出力が生成されるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。