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) // compile-time error }</code>
이 코드는 다음과 같은 컴파일 시간 오류를 제공합니다.
cannot use &f (type *Bar) as type StringerGetter in argument to Printer: *Bar does not implement StringerGetter (wrong type for GetStringer method)
이 문제를 해결하려면 Bar 유형의 GetStringer 메서드가 fmt를 반환해야 합니다. 구체적인 *Foo 유형 대신 .Stringer 인터페이스 또는 인터페이스 대신 구체적인 유형을 허용하도록 StringerGetter 인터페이스를 수정해야 합니다.
외부 구체적 유형을 수정하는 경우 또는 공유 인터페이스가 바람직하지 않은 경우 두 가지 대체 솔루션이 있습니다.
<code class="go">type MyBar struct { Bar } func (b *MyBar) GetStringer() fmt.Stringer { return b.Bar.GetStringer() }</code>
<code class="go">type MyBar struct { embed Bar } func (b *MyBar) GetStringer() fmt.Stringer { return b.GetStringer() }</code>
두 가지 접근 방식을 모두 사용하면 원래 유형이나 공유 인터페이스를 수정하지 않고도 원하는 인터페이스 구현을 제공하면서 외부 구체적 유형으로 작업할 수 있습니다.
위 내용은 구체적인 유형 구현이 Go에서 인터페이스를 반환하는 인터페이스 메서드를 충족하지 못하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!