首頁  >  文章  >  後端開發  >  如何在 Go 中使用反射來取得指向值的指標?

如何在 Go 中使用反射來取得指向值的指標?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-11-01 15:23:02535瀏覽

How to Get a Pointer to a Value Using Reflection in Go?

使用反射來取得指向值的指標

檢查介面的欄位需要在 Go 中使用反射。然而,當嘗試檢索非指標欄位的位址時,就會出現挑戰。本文解決了這些挑戰並提供了解決方案。

在提供的程式碼範例中,名為 InspectStruct 的函數遍歷給定的結構並輸出有關每個欄位的詳細資訊。雖然大多數欄位都被考慮在內,但嵌入在結構中更高層級的非指標欄位會產生「不可尋址」的結果。

問題在於Reflect.Value.Interface() 方法的用法。要取得非指標欄位的位址,建議將reflect.Value而不是interface{}傳遞給InspectStruct函數。下面更正後的程式碼包含了此變更:

<code class="go">func InspectStructV(val reflect.Value) {
    // ... (remaining code is identical)
}

func InspectStruct(v interface{}) {
    InspectStructV(reflect.ValueOf(v))
}</code>

透過此修改,InspectStruct 函數將按預期運行,產生結構內所有欄位的位址,無論其深度或指標狀態為何。這可以在更新的測試結果中看到:

Field Name: Id,  Field Value: 1,     Address: 0x408125440 , Field type: int   , Field kind: int
Field Name: F,   Field Value: {2 {3}},   Address: 0x408125444 , Field type: main.V    , Field kind: struct
Field Name: Id,  Field Value: 2,     Address: 0x408125450 , Field type: int   , Field kind: int
Field Name: F,   Field Value: {3},   Address: 0x408125458 , Field type: main.Z    , Field kind: struct
Field Name: Id,  Field Value: 3,     Address: 0x408125460 , Field type: int   , Field kind: int

以上是如何在 Go 中使用反射來取得指向值的指標?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn