Rumah >pembangunan bahagian belakang >Golang >Bolehkah Kaedah Go dengan Penerima Penunjuk Dipanggil pada Pembolehubah Bukan Penunjuk?

Bolehkah Kaedah Go dengan Penerima Penunjuk Dipanggil pada Pembolehubah Bukan Penunjuk?

Patricia Arquette
Patricia Arquetteasal
2024-12-01 16:22:10556semak imbas

Can Go Methods with Pointer Receivers Be Called on Non-Pointer Variables?

Bolehkah Kaedah Jenis Penunjuk Dipanggil pada Jenis Mudah dalam Go?

Walaupun spesifikasi Go menyatakan bahawa kaedah ditetapkan untuk T termasuk kaedah T, timbul kekeliruan tentang sama ada kaedah dengan penerima T boleh digunakan pada pembolehubah jenis T.

Penggunaan Kaedah

Inti masalah ialah panggilan kaedah tidak terhad kepada menggunakan jenis penerima penuding. Pengkompil bijak mengendalikan invokasi kaedah dengan secara automatik membatalkan rujukan nilai untuk mendapatkan jenis penerima yang dikehendaki. Sebenarnya, panggilan ke kaedah dengan *T penerima adalah bersamaan dengan panggilan pada (&pengguna).m(), di mana &pengguna mendapatkan semula alamat pembolehubah.

Demonstrasi Praktikal

Pertimbangkan contoh kod berikut:

package main

import "fmt"

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.SayWat()
}

Setelah menjalankan kod ini, anda akan perasan bahawa kaedah dilaksanakan dengan jayanya, walaupun pengguna bukan jenis penunjuk. Ini kerana pengkompil secara automatik menolak rujukan pengguna untuk memanggil kaedah SayWat.

Mengatasi Kekaburan

Perbezaan yang pasti muncul apabila berurusan dengan kaedah kembali. Jika kaedah mengembalikan nilai, ia menghasilkan hasil yang tidak boleh ditangani, yang tidak boleh digunakan secara langsung dengan sintaks titik. Sebaliknya, gunakan sintaks "&" secara eksplisit untuk mendapatkan alamat nilai pulangan.

Atas ialah kandungan terperinci Bolehkah Kaedah Go dengan Penerima Penunjuk Dipanggil pada Pembolehubah Bukan Penunjuk?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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