구체적인 유형 구현이 인터페이스 메서드에서 예상되는 인터페이스 유형 대신 구체적인 유형을 반환할 때 Go에서 오류가 발생하는 이유는 무엇입니까?

DDD
풀어 주다: 2024-10-30 07:33:02
원래의
241명이 탐색했습니다.

Why does Go throw an error when a concrete type implementation returns a concrete type instead of the expected interface type in an interface method?

인터페이스 메소드 반환 인터페이스가 구체적인 유형 구현과 일치하지 않음

Go 인터페이스 작업 시 인터페이스의 반환 유형을 선언하는 인터페이스 메소드를 구현하면 오류가 발생할 수 있음 구체적인 유형으로. 이 오류는 메서드 구현이 인터페이스 유형을 직접 반환하지 않고 대신 인터페이스를 구현하는 구체적인 유형을 반환하기 때문에 발생합니다.

다음 예를 고려하세요.

<code class="go">package main

import "fmt"

type Foo struct {
    val string
}

func (f *Foo) String() string {
    return f.val
}

type StringerGetter interface {
    GetStringer() fmt.Stringer
}

type Bar struct{}

func (b *Bar) GetStringer() *Foo {
    return &Foo{"foo"}
}

func Printer(s StringerGetter) {
    fmt.Println(s.GetStringer())
}

func main() {
    f := Bar{}
    Printer(&f)
}</code>
로그인 후 복사

여기서 프린터 함수는 fmt.Stringer를 반환하는 GetStringer 메서드가 있는 StringerGetter 인터페이스를 기대하는 반면 Bar 유형의 GetStringer 메서드는 fmt.Stringer 인터페이스를 구현하는 구체적인 유형 Foo를 반환합니다. 이로 인해 오류가 발생합니다.

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

이 문제에 대한 해결책은 인터페이스의 메서드를 예상되는 인터페이스 유형과 일치시키는 데 있습니다. 이 경우 GetStringer 메서드는 구체적인 유형 대신 fmt.Stringer를 반환해야 합니다.

<code class="go">func (b *Bar) GetStringer() fmt.Stringer {
    return &Foo{"foo"}
}</code>
로그인 후 복사

또는 다음과 같이 원하는 인터페이스를 구현하고 구체적인 유형에 위임하는 래퍼 유형을 만들 수 있습니다. 다음 기술:

위임을 통한 유형 포함:

<code class="go">type MyBar struct{ Bar }

func (b *MyBar) GetStringer() fmt.Stringer {
    return b.Bar.GetStringer()
}</code>
로그인 후 복사

유형 래핑:

<code class="go">type MyBar Bar

func (b *MyBar) GetStringer() fmt.Stringer {
    return &Foo{"foo"}
}</code>
로그인 후 복사

이러한 기술 직접 수정하지 않고도 구체적인 유형과 원활하게 인터페이스할 수 있습니다. 구체적인 유형을 래핑하거나 포함함으로써 원하는 인터페이스 계약을 준수하는 사용자 정의 유형을 생성할 수 있습니다.

위 내용은 구체적인 유형 구현이 인터페이스 메서드에서 예상되는 인터페이스 유형 대신 구체적인 유형을 반환할 때 Go에서 오류가 발생하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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