Dalam Go, apabila berurusan dengan berbilang antara muka dengan tandatangan kaedah yang sama tetapi ditakrifkan dalam pakej berasingan, situasi mungkin timbul apabila jenis yang melaksanakan kedua-dua antara muka membawa kepada tingkah laku yang tidak dijangka.
Pertimbangkan kedua-dua antara muka ini (Doer) dan fungsi (FuncA dan FuncB) yang ditakrifkan dalam pakej yang berbeza:
<code class="go">// Package A type Doer interface { Do() string } func FuncA(doer Doer) // Package B type Doer interface { Do() string } func FuncB(doer Doer)</code>
Jika jenis C melaksanakan Doer daripada kedua-dua pakej dan pelaksanaannya berbeza:
<code class="go">// Package main type C int func (c C) Do() string { return "A-specific implementation" } func main() { cA := C(0); A.FuncA(cA) cB := C(0); B.FuncB(cB) // Behavior differs due to varying `Do()` implementations }</code>
Untuk menangani isu ini, sistem jenis Go menekankan padanan mengikut nama dan ketekalan dalam jenis. Walaupun ia membenarkan objek untuk memenuhi berbilang antara muka, pelaksanaan kaedah dikongsi mesti mematuhi semua kontrak antara muka yang berkenaan.
Dalam senario di atas, penyelesaian melibatkan pelaksanaan jenis pembalut:
<code class="go">// Package main type DoerA struct { C C } func (d DoerA) Do() string { return "A-specific implementation" } type DoerB struct { C C } func (d DoerB) Do() string { return "B-specific implementation" } func main() { cA := DoerA{C(0)}; A.FuncA(cA) cB := DoerB{C(0)}; B.FuncB(cB) // Correct behavior with separate implementations }</code>
Dengan mencipta pembungkus ini, anda boleh mengawal pelaksanaan Do() berdasarkan penggunaan antara muka yang dimaksudkan, memastikan ketekalan dalam konteks pakej masing-masing.
Atas ialah kandungan terperinci Bagaimana Mengendalikan Tandatangan Kaedah Sama Merentas Pakej Berbeza dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!