리플렉션을 사용하여 구조체 필드 수정: CanSet() 및 Structs
리플렉션을 사용하여 구조체 필드를 수정할 때는 원리를 이해하는 것이 중요합니다. 필드 접근성 및 수정 뒤에 있습니다.
구조체용 CanSet()
귀하의 예에서는 구조체 필드에 대해 false를 반환하는 CanSet()을 발견했습니다. 이는 기본적으로 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() 및 구조체로 구조체 필드를 수정하기 위해 리플렉션을 사용하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!