Rumah > pembangunan bahagian belakang > Golang > Go Pointers: Apakah Perbezaan Antara `&` (Alamat-dari) dan `*` (Penyahrujukan)?

Go Pointers: Apakah Perbezaan Antara `&` (Alamat-dari) dan `*` (Penyahrujukan)?

Susan Sarandon
Lepaskan: 2024-12-02 18:59:09
asal
245 orang telah melayarinya

Go Pointers: What's the Difference Between `&` (Address-of) and `*` (Dereference)?

& dan * Penunjuk

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.

Mengatasi Ralat

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
}
Salin selepas log masuk

Pemahaman Penunjuk

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)
Salin selepas log masuk

Maka anda sudah pun menjadi penunjuk, dan operator & tidak diperlukan. Anda juga boleh mencipta penuding secara eksplisit menggunakan:

var u *User
Salin selepas log masuk

Perbezaan antara & dan *

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
Salin selepas log masuk

Sekarang:

  • y memegang nilai 10.
  • *pointerToY mengubah hala ke y dan mencetak nilainya 10.
  • &y mengembalikan alamat y.
  • &pointerToY mengembalikan alamat pointerToY.
  • &pointerToPointerToInt mengembalikan alamat pointerToPointerToInt.
  • **pointerToPointerToInt mencetak nilai 10 kerana ia mengubah hala dua kali y.

Senario Penggunaan

& (Alamat Operator):

  • Untuk menghantar alamat pembolehubah kepada fungsi.
  • Untuk mendapatkan alamat sebelum memberikan penunjuk.
  • Kepada bandingkan dua petunjuk.

Contoh:

func swap(x, y *int) {
    *x, *y = *y, *x
}
Salin selepas log masuk

* (Operator Dereference):

  • Untuk mengakses nilai yang disimpan di alamat.
  • Untuk menetapkan nilai kepada penunjuk.
  • Untuk membandingkan dua penunjuk.

Contoh:

var p *int

*p = 10
Salin selepas log masuk

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!

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