Dalam Go, menghantar pembolehubah sebagai argumen fungsi kadangkala boleh mencetuskan ralat pengkompil, yang boleh diselesaikan dengan menggunakan penunjuk. Walau bagaimanapun, perbezaan antara & dan * petunjuk sering membawa kepada kekeliruan. Artikel ini bertujuan untuk menjelaskan perbezaan dan senario penggunaan untuk kedua-dua jenis penuding.
Dalam contoh anda, ralat mungkin disebabkan oleh ketidakpadanan antara jenis hujah yang dijangkakan dan yang sebenar pembolehubah lulus. Fungsi Nyahkod memerlukan alamat atau penuding kepada struct Pengguna, tetapi anda menghantar nilai secara langsung. Untuk menyelesaikan masalah ini, anda boleh menggunakan & operator untuk mendapatkan alamat pembolehubah Pengguna:
if err := decoder.Decode(&u); err != nil { http.Error(rw, "could not decode request", http.StatusBadRequest) return }
Penunjuk ialah pembolehubah yang memegang alamat pembolehubah lain. Operator & mengembalikan alamat pembolehubah, manakala operator * membenarkan kami mengakses nilai pada alamat tersebut.
Dalam contoh di atas, &u memberikan alamat struct Pengguna, yang kemudiannya dihantar ke Fungsi nyahkod yang mengharapkan penunjuk.
Walau bagaimanapun, jika anda telah mencipta tika Pengguna menggunakan:
u := new(User)
Maka anda sudah pun menjadi penunjuk, dan operator & tidak diperlukan. Anda juga boleh mencipta penuding secara eksplisit menggunakan:
var u *User
Perbezaan utama antara & dan * ialah * mewakili pengalihan kepada nilai yang disimpan di alamat, sambil & mengembalikan alamat sendiri.
Contoh:
var y int var pointerToY *int var pointerToPointerToInt **int y = 10 pointerToY = &y pointerToPointerToInt = &pointerToY
Sekarang:
& (Alamat Operator):
Contoh:
func swap(x, y *int) { *x, *y = *y, *x }
* (Operator Dereference):
Contoh:
var p *int *p = 10
Kesimpulan:
Pemahaman & dan petunjuk adalah penting dalam Go untuk pengendalian pembolehubah yang cekap dan menangani ralat pengkompil. Perbezaan utama terletak pada tingkah laku 'ubah hala' , manakala & mengembalikan alamat sebenar pembolehubah. Dengan mempertimbangkan dengan teliti senario penggunaan yang dimaksudkan, anda boleh memanfaatkan penunjuk dalam kod Go anda dengan berkesan untuk prestasi dan ketepatan yang optimum.
Atas ialah kandungan terperinci Go Pointers: Apakah Perbezaan Antara `&` (Alamat-dari) dan `*` (Penyahrujukan)?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!