Rumah > pembangunan bahagian belakang > Golang > Bolehkah Kaedah Go dengan Jenis Penerima `T` Dipanggil pada Pembolehubah Jenis `*T`?

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

Mary-Kate Olsen
Lepaskan: 2024-11-17 18:27:02
asal
697 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!

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