Rumah > pembangunan bahagian belakang > Golang > Mengapakah Saya Tidak Boleh Menetapkan Penerima Nilai kepada Antara Muka dengan Kaedah Penerima Penunjuk dalam Go?

Mengapakah Saya Tidak Boleh Menetapkan Penerima Nilai kepada Antara Muka dengan Kaedah Penerima Penunjuk dalam Go?

Linda Hamilton
Lepaskan: 2024-11-24 04:15:20
asal
629 orang telah melayarinya

Why Can't I Assign a Value Receiver to an Interface with Pointer Receiver Methods in Go?

Memahami Jenis Penerima untuk Pelaksanaan Antara Muka Go

Dalam Go, kaedah boleh mempunyai sama ada penerima nilai (func (t T) m()) atau penerima penunjuk (func (t *T) m()) untuk jenis struct. Jenis penerima menentukan nilai yang harus digunakan semasa memanggil kaedah.

Pertimbangkan kod berikut:

import "fmt"

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

func main() {
    var t1 tourGuide = tourGuide{"James"}
    t1.hello() // Hello James
    t1.goodbye() // Goodbye James (same as (&t1).goodbye())

    var t2 *tourGuide = &tourGuide{"Smith"}
    t2.hello() // Hello Smith
    t2.goodbye() // Goodbye Smith (same as (*t2).hello())

    // illegal: t1 is not assignable to g1 (why?)
    // var g1 greeter = t1

    var g2 greeter = t2
    g2.hello() // Hello Smith
    g2.goodbye() // Goodbye Smith
}
Salin selepas log masuk

Anda mungkin tertanya-tanya mengapa anda boleh memanggil kaedah TourGuide menggunakan sama ada t1 pembolehubah daripada jenis tourGuide atau penunjuk t2 jenis *tourGuide, tetapi anda tidak boleh menetapkan t1 kepada pembolehubah antara muka g1 jenis penyambut.

Sebabnya terletak pada jenis penerima kaedah antara muka. Dalam kes ini, hello dan goodbye mempunyai penerima penunjuk. Oleh itu, hanya nilai penunjuk boleh digunakan sebagai nilai penerima.

Apabila anda memanggil t1.hello() dan t1.goodbye(), pengkompil secara automatik mengambil alamat t1 dan menggunakannya sebagai penerima , kerana t1 ialah nilai yang boleh dialamatkan.

Walau bagaimanapun, apabila anda cuba menetapkan t1 kepada g1, pengkompil melihat bahawa t1 bukan penunjuk nilai, tetapi nilai jenis tourGuide. Antara muka tidak boleh dialamatkan, jadi pengkompil tidak boleh mengambil alamat t1 dan menetapkannya kepada g1.

Ringkasnya, penerima penunjuk memerlukan nilai penunjuk untuk memanggil kaedah, manakala penerima nilai boleh dipanggil dengan sama ada nilai atau penunjuk. Apabila melaksanakan antara muka dengan kaedah penerima penuding, hanya nilai penuding boleh diberikan kepada antara muka.

Atas ialah kandungan terperinci Mengapakah Saya Tidak Boleh Menetapkan Penerima Nilai kepada Antara Muka dengan Kaedah Penerima Penunjuk 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