구조체에 내장된 인터페이스를 사용하여 Go Reflection: "실제" 함수 감지
임베디드 인터페이스를 구조체에 통합하는 경우(예: 유형 B struct { A; bar string }), Go는 B가 인터페이스 A를 구현해야 한다고 관용적으로 제안합니다. 그러나 리플렉션 패키지는 B의 유형에서 직접 인터페이스 메소드를 검색하므로 혼란을 초래할 수 있습니다.
이 문제를 해결하려면 다음 시나리오를 고려하십시오.
type A interface { Foo() string } type B struct { A bar string }
B의 인스턴스가 있고 해당 Foo를 가져오려고 한다고 가정합니다. 리플렉션을 사용하는 방법:
bType := reflect.TypeOf(B{}) bMeth, has := bType.MethodByName("Foo")
has가 true이면 다음과 같은 질문이 발생합니다. "실제" 구현이 있는지 어떻게 감지할 수 있습니까? 반환된 bMeth의 Foo?
제공된 답변은 간단한 접근 방식을 제안합니다.
method_in_table := B.Foo fmt.Printf("%T \n", method_in_table)
이것은 함수 유형을 출력합니다:
func(main.B) string
b.A가 nil인 경우, 기본적으로 임베디드 인터페이스에는 Foo의 "실제" 구현이 없습니다. 이는 다음을 사용하여 확인할 수 있습니다.
if b.A != nil { b.Foo() }
또한 리플렉션 API 자체는 nil 인터페이스 값을 감지하는 메커니즘을 제공합니다.
if bMeth.Ptr.IsNil() { // there is no "real" implementation of Foo }
위 내용은 내 임베디드 인터페이스 방법이 '진짜'입니까? Go 리플렉션을 통해 구현된 메서드 감지의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!