Bagaimana untuk Menukar Sekeping Jenis Antara Muka kepada Yang Lain dalam Go?

Susan Sarandon
Lepaskan: 2024-10-26 16:27:02
asal
273 orang telah melayarinya

How to Convert a Slice of One Interface Type to Another in Go?

Jenis Penukaran Slices yang Mengandungi Antara Muka Berbeza

Dalam Go, anda mungkin menghadapi senario di mana anda perlu melepasi sekeping satu antara muka kepada fungsi yang menjangkakan sepotong antara muka serasi yang berbeza. Pertimbangkan contoh berikut:

<code class="go">type A interface {
    Close() error
    Read(b []byte) (int, error)
}

type B interface {
    Close() error
}

type Impl struct {}

// Implementation of interface A and B
func (I Impl) Close() error {...}
func (I Impl) Read(b []byte) (int, error) {...}</code>
Salin selepas log masuk

Keserasian Antara Muka

Dalam contoh ini, antara muka A termasuk antara muka B, iaitu, setiap jenis yang melaksanakan A juga melaksanakan B. Sebagai hasilnya, pelaksanaan konkrit A, seperti Impl, memenuhi kedua-dua A dan B.

Melalui Nilai Individu

Jika kita cuba menghantar item individu merentas fungsi, ia berfungsi seperti yang dijangkakan:

<code class="go">im := &Impl{}
single(im) // works</code>
Salin selepas log masuk

Melalui Slices

Namun, apabila cuba menghantar kepingan, kami menghadapi ralat:

<code class="go">list := []A{t}
slice(list) // FAILS!</code>
Salin selepas log masuk

Ralatnya ialah: tidak boleh menggunakan senarai (jenis []A) sebagai jenis []io.Pembaca dalam hujah untuk menghiris

Penyelesaian

Untuk menyelesaikan isu ini, kita boleh buat kepingan baharu jenis antara muka yang diingini secara manual:

<code class="go">ioReaders := make([]io.Reader, len(list))
for i, v := range list {
    ioReaders[i] = v
}

slice(ioReaders) // now works</code>
Salin selepas log masuk

Atas ialah kandungan terperinci Bagaimana untuk Menukar Sekeping Jenis Antara Muka kepada Yang Lain dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!