Go でポインターを含む構造体の値を出力する
Go では、構造体の値を出力する必要がある状況がよく発生します。他の構造体へのポインタが含まれます。ただし、fmt.Printf() の %v 形式指定子のデフォルトの動作では、実際の値の代わりにポインター アドレスが表示されます。
次の例を考えてみましょう。
package main import "fmt" type A struct { a int32 B *B } type B struct { b int32 } func main() { a := &A{ a: 1, B: &B{ b: 2, }, } fmt.Printf("v ==== %+v \n", a) }
の出力上記のコードは次のとおりです:
v ==== &{a:1 B:0xc42000e204}
ご覧のとおり、B フィールドは B 構造体のメモリ アドレスとして出力されます。実際の値。
Stringer インターフェイスを使用したカスタム印刷
ネストされた構造体の内容を印刷する 1 つの方法は、A 型と B 型の両方に Stringer インターフェイスを実装することです。 Stringer インターフェイスには、値の文字列表現を返す String() という 1 つのメソッドが必要です。
Stringer インターフェイスを使用した更新された例を次に示します。
package main import "fmt" type A struct { a int32 B *B } type B struct{ b int32 } func (aa *A) String() string { return fmt.Sprintf("A{a:%d, B:%v}",aa.a,aa.B) } func (bb *B) String() string { return fmt.Sprintf("B{b:%d}",bb.b) } func main() { a := &A{a: 1, B: &B{b: 2}} // using the Stringer interface fmt.Printf("v ==== %v \n", a) // or just print it yourself however you want. fmt.Printf("v ==== A{a:%d, B:B{b:%d}}\n", a.a, a.B.b) // or just reference the values in the struct that are structs themselves // but this can get really deep fmt.Printf("v ==== A{a:%d, B:%v}", a.a, a.B) }
現在の出力は次のようになります。 :
v ==== A{a:1, B:B{b:2}}
マニュアル印刷
Stringer インターフェイスを実装したくない場合は、print ステートメントを使用して構造体の必要な表現を手動で印刷できます。たとえば、ネストされた構造体のフィールドにアクセスして、それらを個別に出力できます。
fmt.Printf("v ==== A{a:%d, B:B{b:%d}}\n", a.a, a.B.b)
このアプローチにより、出力の形式を完全に制御できます。
以上がGoでポインタを使用してネストされた構造体の値を出力するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。