모든 인터페이스 필드 액세스
Go에서 인터페이스는 공유 기능 세트를 통해 다양한 유형의 메소드에 액세스하는 방법을 제공합니다. 그러나 인터페이스 작업 시 구조에 대한 사전 지식 없이 사용 가능한 필드를 결정하는 것이 어려울 수 있습니다.
Reflection 사용
이 문제를 극복하려면, 객체의 기본 구조를 검사할 수 있는 Go의 리플렉션 패키지를 활용할 수 있습니다. Reflect.TypeOf() 함수를 사용하면 인터페이스 값의 개별 필드에 액세스할 수 있는 유형 설명자를 얻을 수 있습니다.
예
의 경우 예를 들어 다음 코드를 고려해보세요.
type Point struct { X int Y int } var reply interface{} = Point{1, 2} t := reflect.TypeOf(reply)
여기서 Reflect.TypeOf()는 Reflect.Type 설명자를 반환합니다. Point 구조체의 경우. NumField() 메서드를 사용하면 구조체의 필드 수를 확인할 수 있습니다. 각 필드 인덱스(i)에 대한 Field(i) 메서드에 액세스하면 다음과 같은 Reflect.StructField 값이 제공됩니다.
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.ValueOf() 함수를 활용하여 얻을 수 있습니다. 인터페이스에서 Reflect.Value를 가져오고 Value.Field() 또는 Value.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에서 인터페이스의 모든 필드에 어떻게 액세스할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!