리플렉션을 사용하여 중첩된 구조체 필드 설정
문제:
리플렉션을 어떻게 사용할 수 있나요? 지속되는 방식으로 중첩된 구조체 필드의 값을 수정하려면?
코드:
<code class="go">type ProductionInfo struct { StructA []Entry } type Entry struct { Field1 string Field2 int } func SetField(source interface{}, fieldName string, fieldValue string) { v := reflect.ValueOf(source) tt := reflect.TypeOf(source) for k := 0; k < tt.NumField(); k++ { fieldValue := reflect.ValueOf(v.Field(k)) fmt.Println(fieldValue.CanSet()) if fieldValue.CanSet() { fieldValue.SetString(fieldValue.String()) } } } func main() { source := ProductionInfo{} source.StructA = append(source.StructA, Entry{Field1: "A", Field2: 2}) SetField(source, "Field1", "NEW_VALUE") }</code>
문제:
해결책:
삽입된 항목을 대상으로 하도록 SetField 호출을 수정하세요. 구조체:
<code class="go">SetField(source.StructA[0], "Field1", "NEW_VALUE")</code>
항목에 대한 포인터를 허용하고 수정하도록 함수를 변경합니다.
<code class="go">func SetField(source *Entry, 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) } }</code>
최종 코드 :
<code class="go">package main import ( "fmt" "reflect" ) type ProductionInfo struct { StructA []Entry } type Entry struct { Field1 string Field2 int } func SetField(source *Entry, fieldName string, fieldValue string) { v := reflect.ValueOf(source).Elem() 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>
출력:
Before: {A 2} true After: {NEW_VALUE 2}
위 내용은 지속성을 달성하기 위해 리플렉션을 사용하여 중첩된 구조체 필드를 어떻게 수정할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!