구조체용 SetString을 사용하여 Reflection 탐색
Reflection은 Go 구조를 동적으로 조작하기 위한 강력한 도구를 제공합니다. 이 예에서는 리플렉션을 사용하여 구조체 필드의 값을 설정하려고 할 때 일반적인 문제에 직면합니다. CanSet()은 항상 false를 반환합니다. 이러한 장애로 인해 현장 수정이 방지되어 우리가 난처해졌습니다.
위험 식별
제공된 코드 조각은 두 가지 근본적인 오류를 강조합니다.
문제 해결
이러한 함정을 해결한 후 코드를 개선할 수 있습니다.
func SetField(source interface{}, fieldName string, fieldValue string) {
v := reflect.ValueOf(source).Elem() // Obtain the value of the pointed object
fmt.Println(v.FieldByName(fieldName).CanSet())
if v.FieldByName(fieldName).CanSet() {
v.FieldByName(fieldName).SetString(fieldValue)
}
}
수정된 SetField() 함수에서 다음을 수행합니다.
작동 중인 코드
이러한 수정으로 이제 코드는 성공적으로 완료되었습니다. Field1 값을 업데이트합니다:
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])
}
출력:
Before: {A 2} true After: {NEW_VALUE 2}
결과는 Entry 구조 내에서 Field1이 성공적으로 수정되었음을 보여줍니다.
부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.
Copyright© 2022 湘ICP备2022001581号-3