使用反射修改結構體欄位:CanSet() 和Structs
使用反射修改結構體欄位時,了解原理很重要訪問性和修改的背後。
結構體的 CanSet()
在您的範例中,您遇到 CanSet() 對於結構體欄位傳回 false。這是因為預設情況下,Go 不允許使用反射來修改結構體的非導出(私有)欄位。這是一項安全措施,旨在防止意外或惡意修改內部結構體狀態。
解決問題
要使用反射設定結構體欄位的值,請考慮以下事項步驟:
修改後的程式碼
以下是解決問題的修改後的程式碼:
<code class="go">func SetField(source interface{}, fieldName string, fieldValue string) { v := reflect.ValueOf(source).Elem() fmt.Println(v.FieldByName(fieldName).CanSet()) if v.FieldByName(fieldName).CanSet() { v.FieldByName(fieldName).SetString(fieldValue) } } func main() { source := ProductionInfo{} source.StructA = append(source.StructA, Entry{Field1: "A", Field2: 2}) fmt.Println("Before: ", source.StructA[0]) SetField(&source.StructA[0], "Field1", "NEW_VALUE") fmt.Println("After: ", source.StructA[0]) }</code>
此程式碼現在將成功修改Entry 結構體的Field1 值。
以上是如何使用反射透過 CanSet() 和 Structs 修改結構體欄位?的詳細內容。更多資訊請關注PHP中文網其他相關文章!