> 백엔드 개발 > Golang > 내 임베디드 인터페이스 방법이 '진짜'입니까? Go 리플렉션을 통해 구현된 메서드 감지

내 임베디드 인터페이스 방법이 '진짜'입니까? Go 리플렉션을 통해 구현된 메서드 감지

Mary-Kate Olsen
풀어 주다: 2025-01-05 15:32:13
원래의
804명이 탐색했습니다.

Is My Embedded Interface Method

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

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿