Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk Lulus Kepingan Antara Muka Serasi dalam Go?

Bagaimana untuk Lulus Kepingan Antara Muka Serasi dalam Go?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-10-25 06:01:02631semak imbas

How to Pass Slices of Compatible Interfaces in Go?

Melalui Kepingan Antara Muka Serasi dalam Go

Dalam Go, anda mungkin menghadapi kesukaran apabila menghantar hirisan satu antara muka ke fungsi yang mengharapkan hirisan antara muka yang berbeza, walaupun yang pertama termasuk yang kedua. Untuk menggambarkan isu ini, pertimbangkan dua antara muka, A dan B, di mana A termasuk B.

`
antara muka jenis A {

Close() error
Read(b []byte) (int, error)

}

jenis B antara muka {

Read(b []byte) (int, error)

}
`

Secara konkrit, struct Impl melaksanakan kedua-dua antara muka:

`
taip Impl struct {}
func (I Impl) Baca(b []bait) (int, ralat) {

return 10, nil

}
func (I Impl) Tutup() ralat {

return nil

}
`

Walaupun item individu boleh dialihkan merentasi fungsi tanpa masalah, penghantaran kepingan menghadapi ralat:

`
func single(r io.Reader) {

fmt.Println("in single")

}
func slice(r []io.Reader) {

fmt.Println("in slice")

}

impl := &Impl{}
single(impl) / / berfungsi

senarai := []A{impl}
slice(list) // GAGAL
`

Untuk menyelesaikan masalah ini, anda mesti mencipta kepingan baharu yang dijangkakan taip ([]io.Reader) dan isikannya dengan elemen daripada kepingan sumber ([]A):

`
newSlice := make([]io.Reader, len(list))
untuk i, v := senarai julat {

newSlice[i] = v

}
slice(newSlice)
`

Pendekatan ini membolehkan anda menghantar kepingan satu antara muka kepada fungsi mengharapkan hirisan antara muka yang serasi yang lain, menyelesaikan ralat yang dibangkitkan apabila cuba meneruskan hirisan asal secara terus.

Atas ialah kandungan terperinci Bagaimana untuk Lulus Kepingan Antara Muka Serasi dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn