이 문서에서는 포인터가 포함된 구조체의 필드 값을 검색하려고 할 때 직면하는 문제를 살펴보겠습니다. 또 다른 구조체.
다음 예를 고려해보세요.
type Family struct { first string last string } type Person struct { name string family *Family }
Family에 대한 포인터를 가진 Person이 있다고 상상해 보세요. 리플렉션을 사용하여 Family의 마지막 필드에 액세스하려고 합니다. 다음 코드는 오류로 인해 실패합니다.
func Check(data interface{}) { var v = reflect.ValueOf(data) if v.Kind() == reflect.Struct { fmt.Println("was a struct") v = v.FieldByName("family").FieldByName("last") fmt.Println(v) } }
발생한 오류는 다음과 같습니다.
reflect: ptr Value에 대한 Reflect.Value.FieldByName 호출
이유는 다음과 같습니다. 이 오류는 가리키는 값이 아닌 포인터를 나타내는 Reflect.Value에서 .FieldByName("family")를 호출하려고 한다는 것입니다.
이 문제를 해결하려면 먼저 간접적으로 .FieldByName()을 호출하기 전의 포인터 값입니다. 수정된 코드는 다음과 같습니다.
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) } }
reflect.Indirect()를 사용하여 포인터 값을 간접적으로 역참조함으로써 기본 값에 액세스한 다음 .FieldByName()을 사용하여 마지막 필드를 검색할 수 있습니다.
위 내용은 Go에서 리플렉션을 사용하여 포인터의 필드 값을 검색하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!