리플렉션을 사용하여 구조체 필드 수정: CanSet() 및 구조체
리플렉션을 사용하여 구조체 필드를 수정할 때는 원칙을 이해하는 것이 중요합니다. 필드 접근성 및 수정 뒤에 있습니다.
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