구조체에 내장된 인터페이스를 사용한 Go 리플렉션: "실제" 함수 결정
Go 리플렉션 패키지의 맥락에서 구조체의 동작 이해 익명 인터페이스가 포함된 필드가 중요합니다. 다음 코드 조각을 고려해보세요.
type A interface { Foo() string } type B struct { A bar string }
B가 인터페이스 A를 구현해야 한다고 가정하는 것이 직관적이지만 Go의 동적 특성으로 인해 다른 해석이 가능합니다. B에 포함된 익명 인터페이스 값은 다른 구조체 필드와 유사한 필드 역할을 합니다.
리플렉션을 사용하면 다음과 같이 B 유형에서 메서드를 검색할 수 있습니다.
bType := reflect.TypeOf(B{}) bMeth, has := bType.MethodByName("Foo")
그러나 존재 여부는 bMeth는 B에 대한 "실제" 함수 구현의 존재를 보장하지 않습니다. 발생한 것과 같은 패닉을 방지하려면 B에 대해 정의된 실제 함수가 있는지 확인하는 방법이 필요합니다. B.
구현 부재 감지
"실제" 함수와 상속된 인터페이스 메서드를 구별하는 핵심은 내장된 익명의 인터페이스 측면에 있습니다. 인터페이스. 구조체에 명시적인 구현이 없으면 인터페이스 메서드는 내장된 인터페이스에서 효과적으로 상속됩니다.
실제 함수가 있는지 확인하려면:
if bMeth.Type.NumIn() == 1 && bMeth.Type.NumOut() == 1 { fmt.Println("Real function found") } else { fmt.Println("Interface method inherited") }
이 검사에서는 숫자를 검사합니다. 검색된 메소드에 대한 입력 및 출력 매개변수입니다. 둘 다 1이면 해당 메서드가 하나의 수신자 매개변수(B 인스턴스)를 받아들이고 하나의 값을 반환하므로 "실제" 함수 구현임을 나타냅니다. 그렇지 않고, 이들 숫자가 다를 경우, 메소드는 인터페이스에서 상속됩니다.
대체 접근 방식: 유형 전환
리플렉션을 사용하는 대신 선택적으로 유형 전환을 사용할 수 있습니다. b.A.의 동적 유형을 기반으로 실행됩니다. b.A가 nil이면 "실제" 구현이 없음을 나타냅니다.
switch b.A.(type) { case nil: fmt.Println("No function implementation in B") default: fmt.Println("Function implementation found") }
결론
내장된 익명 인터페이스의 특성을 이해하고 두 가지 반사 중 하나를 사용하면 됩니다. 사용자 정의 검사 또는 유형 전환을 통해 인터페이스 메소드를 상속하는 구조체 필드에 대한 "실제" 함수의 존재를 효과적으로 확인할 수 있습니다.
위 내용은 임베디드 인터페이스가 있는 Go 구조체에 리플렉션을 사용하여 '실제' 함수 구현이 있는지 어떻게 확인할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!