다음은 오류의 \'이유\' 및 \'어떻게\'를 다루는 몇 가지 제목 옵션입니다. \'왜\'에 대한 강조 * 내 Go 코드가 St 유형으로 \'cannot use...를 던지는 이유는 무엇입니까?

Barbara Streisand
풀어 주다: 2024-10-27 05:25:03
원래의
1008명이 탐색했습니다.

Here are a few title options,  playing with the

인터페이스 메소드 반환 유형 불일치 이해

오류 메시지:

cannot use &f (type *Bar) as type StringerGetter in argument to
Printer:  *Bar does not implement StringerGetter (wrong type for GetStringer method) have GetStringer() *Foo want GetStringer() fmt.Stringer
로그인 후 복사

Go에서 인터페이스 메소드는 다음에 의존합니다. 정확한 유형 일치. 즉, 인터페이스를 반환하는 함수는 인터페이스와 해당 구현 모두에서 정확히 동일한 유형을 가져야 합니다. 일치하지 않으면 Go는 컴파일 시간 오류를 생성합니다.

이 경우 StringerGetter 인터페이스는 fmt.Stringer를 반환하는 GetStringer() 메서드를 지정합니다. 그러나 구체적인 유형 Bar의 GetStringer() 구현은 fmt.Stringer가 아닌 Foo 구조체에 대한 포인터를 반환합니다. 이러한 불일치로 인해 컴파일 시간 오류가 발생합니다.

해결책:

  1. 인터페이스를 정확하게 구현:

    • Bar의 GetStringer() 메서드를 변경하여 fmt.Stringer를 직접 반환합니다.
  2. 콘크리트 유형을 새 유형으로 래핑합니다.

    • Bar를 포함하고 Bar의 포함된 GetStringer() 메서드를 사용하여 StringerGetter를 구현하는 MyBar와 같은 새로운 유형을 만듭니다. 이를 통해 Bar의 기능을 유지하면서 인터페이스를 준수할 수 있습니다.
  3. 어설션 사용:

    • 구체적인 유형을 어설션합니다. GetStringer() 메서드에서 반환하기 전에 fmt.Stringer를 입력하기 위한 바입니다. 이 솔루션은 성능 및 런타임에 잠재적인 영향을 미칠 수 있습니다.

중요 고려 사항:

  • 인터페이스는 메서드 서명만 지정합니다. 메소드 구현이 아닙니다.
  • 구체적 유형이 인터페이스에 필요한 것과 다른 서명으로 메소드를 구현하는 경우 인터페이스 구현으로 간주되지 않습니다.
  • 유형 어설션은 특정 시나리오에서 유용할 수 있습니다. , 그러나 런타임 오류 및 성능 오버헤드를 방지하려면 주의해서 사용해야 합니다.

위 내용은 다음은 오류의 \'이유\' 및 \'어떻게\'를 다루는 몇 가지 제목 옵션입니다. \'왜\'에 대한 강조 * 내 Go 코드가 St 유형으로 \'cannot use...를 던지는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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