구조체에 대해 SetString을 사용하여 Reflection 탐색
Reflection은 Go 구조를 동적으로 조작하기 위한 강력한 도구를 제공합니다. 이 예에서는 리플렉션을 사용하여 구조체 필드의 값을 설정하려고 할 때 일반적인 문제에 직면합니다. CanSet()은 항상 false를 반환합니다. 이러한 방해로 인해 현장 수정이 방지되어 우리는 어려움에 빠지게 됩니다.
위험 식별
제공된 코드 조각은 두 가지 근본적인 오류를 강조합니다.
문제 해결
이러한 함정을 해결한 후 코드를 개선할 수 있습니다.
<code class="go">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) } }</code>
수정된 SetField() 함수에서 다음을 수행합니다.
코드 실행
이러한 수정을 통해 이제 코드는 Field1 값을 성공적으로 업데이트했습니다.
<code class="go">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>
출력:
Before: {A 2} true After: {NEW_VALUE 2}
결과는 Entry 구조 내에서 Field1이 성공적으로 수정되었음을 보여줍니다.
위 내용은 리플렉션을 사용하여 구조체 필드 값을 설정할 때 SetCan()이 항상 False를 반환하는 문제를 해결하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!