在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 .Stringer 介面而不是具體的*Foo 類型,或者應該修改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中文網其他相關文章!