구조체에 내장된 인터페이스를 사용하여 Go Reflection: "실제" 함수 식별
다음 코드 조각을 고려하세요.
type A interface { Foo() string } type B struct { A bar string }
Go의 관용적 접근 방식에 따르면 위의 패턴은 B가 다음을 구현해야 함을 나타냅니다. 인터페이스. 그러나 OOP 언어와 달리 이에 대한 컴파일 타임 확인은 없습니다. 대신 인터페이스의 일부만 구현하도록 선택할 수 있습니다.
Reflection을 사용하면 수신자 B가 있는 메서드가 없더라도 B의 유형에서 직접 A의 메서드를 검색할 수 있습니다. 그러나 이는 질문을 제기합니다. 패닉을 유발하기 전에 "실제" 구현이 존재하는지 어떻게 감지할 수 있습니까?
이 문제를 해결하려면 리플렉션에만 의존할 수는 없습니다. 대신 간단한 접근 방식을 사용해 보세요.
method_in_table := B.Foo // Check if the method is nil if method_in_table == nil { fmt.Println("No real implementation found") } else { // Method is present }
또는 다음과 같은 반영 기반 검사를 사용할 수도 있습니다.
bType := reflect.TypeOf(B{}) bMeth, has := bType.MethodByName("Foo") if !has || bMeth.Func.ptr.IsZero() { // No real implementation found } else { // Method is present }
이 시나리오에서는 bMeth의 ptr 필드가 function is 0을 사용하면 해당 함수가 익명 인터페이스 값의 함수 테이블에 있는지 확인할 수 있습니다. 0이면 B 구조체에 해당 메서드가 없으며 실제 구현이 부족함을 나타냅니다.
위 내용은 리플렉션을 사용하여 Go에서 '실제' 인터페이스 구현을 어떻게 감지할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!