使用反射來取得指向值的指標
檢查介面的欄位需要在 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中文網其他相關文章!