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

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

Barbara Streisand
Barbara Streisand원래의
2024-10-27 05:25:031074검색

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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