Dalam Go, hujah fungsi boleh dihantar sama ada melalui nilai atau rujukan. Apabila melalui nilai, salinan pembolehubah dibuat dan dihantar ke fungsi. Apabila melalui rujukan, alamat pembolehubah dilalui sebaliknya, membenarkan fungsi mengubah suai nilai asal.
Konsep lulus melalui rujukan ini dicapai menggunakan penunjuk. Penunjuk ialah pembolehubah yang memegang alamat pembolehubah lain. Operator & mengembalikan alamat pembolehubah, manakala operator * digunakan untuk mengakses nilai yang disimpan pada alamat.
Operator & digunakan untuk menghantar pembolehubah melalui rujukan sebagai hujah fungsi. Sebagai contoh, pertimbangkan fungsi berikut:
func SendNotification(user *User) { // ... }
Fungsi ini menjangkakan *Pengguna sebagai hujah, dengan * menunjukkan bahawa hujah ialah penunjuk kepada struct Pengguna. Untuk menghantar pembolehubah u jenis Pengguna, anda perlu menggunakan operator & seperti:
SendNotification(&u)
Ini menghantar alamat u kepada fungsi, membenarkan ia mengubah suai nilai asal.
Pengendali * digunakan untuk mengakses nilai yang disimpan di alamat. Contohnya, diberi kod berikut:
var userPtr *User userPtr = &u
userPtr ialah penunjuk yang menyimpan alamat struct Pengguna yang disimpan dalam u. Untuk mengakses nilai yang disimpan di alamat ini, kita boleh menggunakan operator *:
*userPtr = User{name: "John"}
Ini memberikan nilai baharu kepada struct Pengguna di alamat yang disimpan dalam userPtr.
Perbezaan antara & dan * terletak pada fungsinya. & digunakan untuk mendapatkan alamat pembolehubah, membenarkan ia diluluskan melalui rujukan. * digunakan untuk mengakses nilai yang disimpan pada alamat, membenarkan pengubahsuaian kepada nilai asal.
Dalam amalan, & biasanya digunakan untuk menghantar pembolehubah dengan merujuk kepada fungsi, manakala * digunakan untuk mengubah suai nilai yang disimpan pada alamat, seperti apabila menggunakan penunjuk sebagai penerima dalam kaedah.
Pertimbangkan perkara berikut kod:
func main() { u := User{name: "Jane"} SendNotification(&u) // Passing by reference fmt.Println(u.name) // Prints "Jane" }
Di sini, fungsi SendNotification mengambil *Pengguna sebagai hujah. Dengan melepasi &u, kami membenarkan fungsi mengubah suai nilai asal u. Di dalam fungsi, nilai boleh diubah suai seperti ini:
func SendNotification(user *User) { user.name = "John" }
Ini akan menukar nama struct Pengguna yang diluluskan melalui rujukan.
Atas ialah kandungan terperinci Penunjuk Pergi: Apakah Perbezaan Antara `&` dan `*` dan Bagaimana Ia Digunakan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!