使用反射修改結構體欄位:CanSet() 和Structs
使用反射修改結構體欄位:CanSet() 和Structs使用反射修改結構體欄位時,了解原理很重要後面的字段可訪問性和修改。
CanSet() for Structs在您的範例中,您遇到 CanSet() 對於結構欄位傳回 false。這是因為預設情況下,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])
}
func SetField(源接口{ }, fieldName 字串, fieldValue 字串) { v :=reflect.ValueOf(source).Elem() fmt.Println(v.FieldByName(fieldName).CanSet()) if v.FieldByName(fieldName).CanSet() { v.FieldByName(fieldName).SetString(fieldValue) } } 函數主() { 資料來源:= 生產資訊{} source.StructA = 附加(source.StructA, Entry{Field1: "A", Field2: 2}) fmt.Println("之前:", source.StructA[0]) SetField(&source.StructA[0], "Field1", "NEW_VALUE") fmt.Println("之後:", source.StructA[0]) }
此程式碼現在將成功修改 Entry 結構體的 Field1 值。
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3