Bolehkah Kaedah Penerima Penunjuk Go Dipanggil pada Pembolehubah Bukan Penunjuk?

Barbara Streisand
Lepaskan: 2024-11-27 21:49:16
asal
928 orang telah melayarinya

Can Go's Pointer Receiver Methods Be Called on Non-Pointer Variables?

Kaedah Memanggil untuk Jenis Penunjuk *T dengan Penerima T

Spesifikasi bahasa pengaturcaraan Go menyatakan bahawa set kaedah bagi sebarang jenis T terdiri daripada semua kaedah dengan jenis penerima T. Walau bagaimanapun, set kaedah jenis penunjuk yang sepadan T ialah set semua kaedah dengan penerima T atau T (termasuk set kaedah T).

Ini bermakna kita boleh memanggil kaedah dengan penerima jenis *T pada pembolehubah jenis T, kerana pengkompil secara tersirat menolak rujukan pembolehubah kepada panggil kaedah.

Untuk mengesahkan konsep ini, pertimbangkan kod berikut:

package main

import (
    "fmt"
    "reflect"
)

type User struct{}

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

func main() {
    var user User = User{}

    fmt.Println(reflect.TypeOf(user), "\n")

    user.SayWat()
}
Salin selepas log masuk

Apabila kami menjalankan kod ini, kami perhatikan bahawa kaedah SayWat() boleh dipanggil pada pembolehubah pengguna, walaupun kaedah itu ditakrifkan dengan penerima penunjuk. Ini kerana pengkompil secara automatik menolak pembolehubah untuk kita.

Walau bagaimanapun, adalah penting untuk ambil perhatian bahawa kita tidak boleh memanggil kaedah *T pada T secara langsung. Sebagai contoh, kod berikut akan gagal dengan ralat pengkompil:

func main() {
    var user User = User{}

    (&user).SayWat()
}
Salin selepas log masuk

Dalam kes ini, pengkompil tidak boleh menyahrujuk pembolehubah secara tersirat kerana kaedah SayWat() ditakrifkan dengan penerima penuding. Untuk memanggil kaedah, kita mesti secara eksplisit menolak pembolehubah dengan operator &.

Oleh itu, walaupun kita boleh memanggil kaedah dengan penerima jenis T pada pembolehubah jenis T, kita tidak boleh memanggil kaedah T pada T secara langsung.

Atas ialah kandungan terperinci Bolehkah Kaedah Penerima Penunjuk Go Dipanggil pada Pembolehubah Bukan Penunjuk?. 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