Rumah > pembangunan bahagian belakang > Golang > Mengapakah Penyahrujukan Secara Tersirat Apabila Memanggil Kaedah Penerima Penunjuk?

Mengapakah Penyahrujukan Secara Tersirat Apabila Memanggil Kaedah Penerima Penunjuk?

DDD
Lepaskan: 2024-12-02 07:03:10
asal
802 orang telah melayarinya

Why Does Go Implicitly Dereference When Calling Pointer Receiver Methods?

Set Kaedah Go: Kaedah Sebut untuk Jenis Penunjuk dan Penerima

Satu aspek set kaedah Go yang sering dibincangkan timbul apabila cuba membuat panggilan kaedah dengan jenis penerima T pada pembolehubah jenis T. Spesifikasi Go menyatakan bahawa set kaedah T termasuk kedua-dua kaedah dengan jenis penerima *T dan kaedah dengan jenis penerima T.

Inferens Bercanggah

Walau bagaimanapun, contoh berikut menunjukkan bahawa inferens ini boleh kelihatan berlawanan dengan intuisi:

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

Penyusun Inferens

Pengkompil membuat kesimpulan bahawa pengguna.SayWat() memanggil kaedah dengan jenis penerima *T, walaupun pengguna boleh ubah mempunyai jenis T. Tingkah laku ini disebabkan oleh pemasukan automatik pengkompil bagi &, alamat-pengendali. Pada dasarnya, ia menulis semula panggilan kepada (&pengguna).SayWat().

Kaedah Memanggil untuk Jenis Penunjuk

Adalah penting untuk menjelaskan bahawa sementara nampaknya kaedah untuk jenis penunjuk dipanggil pada pembolehubah jenis T, ini tidak benar. Pengkompil menggunakan penerima jenis *T dan penyahrujukan &pengguna kepada T ialah operasi tersirat.

Pengecualian kepada Penyahrujukan Tersirat

Walau bagaimanapun, tersirat ini penyahrujukan tidak terpakai dalam semua kes. Memanggil kaedah dengan penerima penuding pada nilai pulangan (tidak boleh dialamatkan) akan mengakibatkan ralat masa kompilasi, seperti:

func aUser() User {
    return User{}
}

...

aUser().SayWat()
Salin selepas log masuk

Mesej Ralat

cannot call pointer method on aUser()
cannot take the address of aUser()
Salin selepas log masuk

Atas ialah kandungan terperinci Mengapakah Penyahrujukan Secara Tersirat Apabila Memanggil Kaedah Penerima 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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan