Dalam Go, kaedah antara muka yang mengembalikan antara muka hanya sepadan dengan pelaksanaan yang mengisytiharkan antara muka itu sendiri, bukan konkrit jenis yang melaksanakan antara muka. Pertimbangkan contoh berikut:
<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>
Kod ini memberikan ralat masa kompilasi berikut:
cannot use &f (type *Bar) as type StringerGetter in argument to Printer: *Bar does not implement StringerGetter (wrong type for GetStringer method)
Untuk menyelesaikan isu ini, sama ada kaedah GetStringer dalam jenis Bar harus mengembalikan fmt .Antara muka Stringer bukannya konkrit *Jenis Foo, atau antara muka StringerGetter harus diubah suai untuk menerima jenis konkrit dan bukannya antara muka.
Dalam kes di mana mengubah suai jenis konkrit luaran atau antara muka yang dikongsi tidak diingini, terdapat dua penyelesaian alternatif:
<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>
Kedua-dua pendekatan membolehkan anda bekerja dengan jenis konkrit luaran sambil menyediakan pelaksanaan antara muka yang diingini tanpa mengubah suai jenis asal atau antara muka yang dikongsi.
Atas ialah kandungan terperinci Mengapa Perlaksanaan Jenis Konkrit Tidak Memuaskan Kaedah Antara Muka Mengembalikan Antara Muka dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!