리플렉션이 있는 인터페이스에서 필드 접근성 발견
인터페이스의 동적 특성으로 인해 응답 객체 내에서 액세스 가능한 필드를 확인하는 방법에 대한 의문이 제기됩니다. . 리플렉션은 솔루션을 제공하지만 필드 이름에 대한 사전 지식이 필요합니다. 이 기사에서는 반사 기술을 신중하게 적용하여 사용 가능한 모든 필드를 검색하는 방법을 살펴봅니다.
reflect.TypeOf()를 도입하면 반사를 얻을 수 있는 길이 열립니다. 설명자를 입력하세요. 이 설명자를 사용하면 인터페이스 내에 보관된 동적 값과 연결된 필드를 열거할 수 있습니다.
다음 예를 고려하세요.
type Point struct { X int Y int } var reply interface{} = Point{1, 2} t := reflect.TypeOf(reply) for i := 0; i < t.NumField(); i++ { fmt.Printf("%+v\n", t.Field(i)) }
이 코드 조각으로 생성된 출력은 필드의 성공적인 검색을 보여줍니다. 정보:
{Name:X PkgPath: Type:int Tag: Offset:0 Index:[0] Anonymous:false} {Name:Y PkgPath: Type:int Tag: Offset:4 Index:[1] Anonymous:false}
각 필드는 reflect.StructField 구조체는 필드 이름과 같은 세부 정보를 제공합니다.
필드 값을 얻으려면 reflect.ValueOf()를 사용하여 반영.가치. 이 값을 사용하면 Field() 또는 FieldByName() 메서드를 통해 필드에 액세스할 수 있습니다.
v := reflect.ValueOf(reply) for i := 0; i < v.NumField(); i++ { fmt.Println(v.Field(i)) }
이 결과는 다음과 같습니다.
1 2
참고: 구조에 대한 포인터가 인터페이스, Type.Elem() 및 Value.Elem()을 활용하여 기본 유형이나 값으로 이동할 수 있습니다.
마지막으로 다음과 같은 상황을 고려합니다. 포인터의 존재 여부는 불확실합니다. Type.Kind() 및 Value.Kind()는 reflect.Ptr과 비교하는 데 활용될 수 있습니다.
Go에서의 리플렉션에 대한 포괄적인 가이드는 블로그 게시물 "The Laws"를 참조하세요. 반성합니다."
위 내용은 Go 인터페이스에서 접근 가능한 필드를 검색하기 위해 리플렉션을 어떻게 사용할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!