使用反射修改结构体字段: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])
}
此代码现在将成功修改 Entry 结构体的 Field1 值。
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3