使用嵌套结构体时,在不显示其内存地址的情况下打印其值可能会很困难。我们来看这个例子:
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}}
但是,在处理深层嵌套结构时,这种方法可能会变得复杂。
在总之,您可以通过实现 Stringer 接口、手动打印值或直接引用结构体值来打印没有指针的嵌套结构体值。选择最适合您特定需求的方法。
以上是如何在没有内存地址的情况下在 Golang 中打印嵌套结构体值?的详细内容。更多信息请关注PHP中文网其他相关文章!