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