使用巢狀結構體時,在不顯示其記憶體位址的情況下列印其值可能會很困難。讓我們來看這個範例:
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中文網其他相關文章!