>백엔드 개발 >Golang >리플렉션을 사용하여 Go에서 '실제' 인터페이스 구현을 어떻게 감지할 수 있습니까?

리플렉션을 사용하여 Go에서 '실제' 인터페이스 구현을 어떻게 감지할 수 있습니까?

Patricia Arquette
Patricia Arquette원래의
2024-12-23 22:29:19446검색

How Can I Detect a

구조체에 내장된 인터페이스를 사용하여 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.