Mengapakah Go Struct dengan Kaedah Penerima Penunjuk Memuaskan Antara Muka?

Mary-Kate Olsen
Lepaskan: 2024-11-19 17:56:02
asal
866 orang telah melayarinya

Why Can't a Go Struct with a Pointer Receiver Method Satisfy an Interface?

Jenis Kaedah Go Struct Memuaskan Antara Muka

Dalam Go, struct boleh mempunyai kaedah dengan pelbagai jenis penerima (nilai atau penunjuk). Walaupun kaedah dengan penerima nilai boleh dipanggil sama ada pada nilai atau penunjuk struktur, kaedah dengan penerima penunjuk memerlukan penerima penunjuk.

Pertimbangkan contoh yang disediakan:

type greeter interface {
    hello()
    goodbye()
}

type tourGuide struct {
    name string
}

func (t tourGuide) hello()    { fmt.Println("Hello", t.name) }
func (t *tourGuide) goodbye() { fmt.Println("Goodbye", t.name) }
Salin selepas log masuk

Kita boleh memanggil kaedah TourGuide menggunakan kedua-dua nilai t1 dan penunjuk t2. Walau bagaimanapun, apabila melaksanakan antara muka, memberikan nilai TourGuide kepada pembolehubah antara muka penyambut adalah tidak dibenarkan.

Sebabnya ialah jika kaedah mempunyai penerima penunjuk, hanya nilai penunjuk boleh digunakan sebagai penerima. Memandangkan nilai antara muka ialah salinan nilai yang dibalut dan tidak boleh dialamatkan, nilai tersebut tidak boleh dihantar kepada kaedah dengan penerima penuding.

Sekatan ini menghalang potensi isu di mana pengubahsuaian yang dibuat melalui penerima penunjuk hanya akan menjejaskan salinan dalam antara muka, bukan nilai asal.

Oleh itu, untuk antara muka menerima jenis nilai, semua kaedahnya mesti mempunyai penerima nilai. Dalam contoh kami, memandangkan selamat tinggal mempunyai penerima penunjuk, TourGuide tidak boleh ditugaskan untuk memberi salam.

Atas ialah kandungan terperinci Mengapakah Go Struct dengan Kaedah Penerima Penunjuk Memuaskan Antara Muka?. 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