Bolehkah Kaedah Go dengan Jenis Penerima `T` Dipanggil pada Pembolehubah Jenis `*T`?

Mary-Kate Olsen
Lepaskan: 2024-11-17 18:27:02
asal
584 orang telah melayarinya

Can Go Methods with Receiver Type `T` Be Called on Variables of Type `*T`?

Kaedah Go pada Jenis Penunjuk: Kaedah Memanggil dengan Penerima T untuk Jenis Penunjuk *T

Soalan:

Spesifikasi Go menyatakan bahawa set kaedah jenis penunjuk T termasuk set kaedah jenis T yang sepadan. Adakah ini bermakna kita boleh memanggil kaedah dengan penerima T pada pembolehubah jenis T?

Jawapan:

Walaupun spesifikasi mencadangkan ini, adalah penting untuk ambil perhatian bahawa anda tidak boleh secara langsung memanggil kaedah *T pada T. Sebaliknya, pengkompil secara automatik menolak rujukan berubah kepada &T dan menggunakan kaedah, melaksanakan (&T).m() dengan berkesan.

Tingkah laku ini ditakrifkan secara eksplisit dalam spesifikasi Go:

"Panggilan: Panggilan kaedah x.m() ialah sah jika set kaedah (jenis) x mengandungi m dan senarai argumen boleh diberikan kepada senarai parameter m Jika x boleh dialamatkan dan set kaedah &x mengandungi m, x.m() ialah singkatan untuk (&x).m. (). "

Demonstrasi:

Contoh berikut menggambarkan tingkah laku ini:

package main

import (
    "fmt"
    "reflect"
)

type User struct{}

func (this *User) SayWat() {
    fmt.Println(reflect.TypeOf(this))
    fmt.Println("WAT\n")
}

func main() {
    var user = User{}

    fmt.Println(reflect.TypeOf(user))

    user.SayWat()
}
Salin selepas log masuk

Walaupun mengisytiharkan kaedah SayWat dengan penerima * Pengguna, kami boleh memanggilnya pada pengguna, iaitu jenis Pengguna. Pengkompil mengendalikan penyahrujukan dan panggilan (&pengguna) secara automatik. Jika anda cuba memanggil kaedah penunjuk pada nilai yang tidak boleh dialamatkan, anda akan menghadapi ralat. Contohnya:

Atas ialah kandungan terperinci Bolehkah Kaedah Go dengan Jenis Penerima `T` Dipanggil pada Pembolehubah Jenis `*T`?. 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