ネストされた構造体を操作する場合、メモリ アドレスを表示せずに値を出力するのは難しい場合があります。この例を見てみましょう:
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) }
このコードを実行すると、出力にネストされた構造体 B のメモリ アドレスが含まれていることがわかります:
v ==== &{a:1 B:0xc42000e204}
実際の値を取得するにはB の場合、次のいずれかのアプローチを採用できます。
ネストされた構造体に Stringer インターフェイスを実装すると、印刷時にその文字列表現がどのようにフォーマットされるかを定義できます。その方法は次のとおりです:
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) }
この実装では、%v 形式指定子を使用して構造体のカスタム文字列表現を出力できるようになりました:
fmt.Printf("v ==== %v \n", a) // Output: v ==== A{a:1, B:B{b:2}}
また、Stringer インターフェイスに依存せずに値を手動で出力することもできます。このアプローチにより、出力形式をより詳細に制御できるようになります。
fmt.Printf("v ==== A{a:%d, B:B{b:%d}}\n", a.a, a.B.b) // Output: v ==== A{a:1, B:B{b:2}}
構造体参照の出力を避けたい場合は、その値を明示的に参照できます:
fmt.Printf("v ==== A{a:%d, B:%v}", a.a, a.B) // Output: v ==== A{a:1, B:&{b:2}}
ただし、深くネストされたものを扱う場合、このアプローチは複雑になる可能性があります。 structs.
要約すると、Stringer インターフェイスを実装するか、値を手動で出力するか、構造体の値を直接参照することで、ポインターなしでネストされた構造体の値を出力できます。特定のニーズに最も適したアプローチを選択してください。
以上がメモリアドレスなしでGolangでネストされた構造体の値を出力する方法?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。