제공된 코드에서 데이터 구조는 정의한 struct Family는 Person 구조체에 포인터로 저장됩니다. Reflect 패키지를 사용하여 지정된 Family 내의 필드에 액세스하려고 하면 "reflect: ptr Value에서 Reflect.Value.FieldByName 호출" 오류가 발생합니다.
오류 이해
이 오류는 Reflect 패키지의 FieldByName 함수가 포인터가 아닌 값을 입력으로 예상하기 때문에 발생합니다. FieldByName의 수신자로 포인터(*Family)를 사용하면 함수는 가리키는 값 대신 포인터 자체에 액세스하려고 시도합니다.
문제 해결
이 문제를 해결하려면 필드에 액세스하기 전에 포인터를 간접 참조해야 합니다. 이는 Reflect 패키지의 Indirect 함수를 사용하여 수행할 수 있습니다.
familyPtr := v.FieldByName("family") v = reflect.Indirect(familyPtr).FieldByName("last")
업데이트된 코드
포인터 값을 올바르게 처리하는 업데이트된 코드는 다음과 같습니다.
func Check(data interface{}) { var v = reflect.ValueOf(data) if v.Kind() == reflect.Struct { fmt.Println("was a struct") familyPtr := v.FieldByName("family") v = reflect.Indirect(familyPtr).FieldByName("last") fmt.Println(v) } }
위 내용은 Go에서 리플렉션을 사용하여 가리키는 구조체의 필드에 액세스하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!