Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapakah Go Struct dengan Kaedah Penerima Penunjuk Memuaskan Antara Muka?

Mengapakah Go Struct dengan Kaedah Penerima Penunjuk Memuaskan Antara Muka?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-11-19 17:56:02863semak imbas

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) }

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!

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