Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Adakah terdapat rujukan lewat dalam bahasa go?

Adakah terdapat rujukan lewat dalam bahasa go?

青灯夜游
青灯夜游asal
2022-12-20 12:09:355446semak imbas

Tidak. Go tidak mempunyai pembolehubah rujukan, jadi tiada rujukan lulus semasa memanggil fungsi dalam bahasa Go. Setiap pembolehubah yang ditakrifkan dalam program Go menduduki lokasi memori yang unik Tidak mungkin untuk mencipta dua pembolehubah yang berkongsi lokasi memori yang sama adalah mungkin untuk mencipta dua pembolehubah yang menghala ke lokasi memori yang sama, tetapi ini tidak sama dengan dua pembolehubah berkongsi memori yang sama Lokasinya berbeza.

Adakah terdapat rujukan lewat dalam bahasa go?

Persekitaran pengendalian tutorial ini: sistem Windows 7, GO versi 1.18, komputer Dell G3.

Adalah jelas bahawa Go tidak mempunyai pembolehubah rujukan, jadi tiada laluan rujukan semasa memanggil fungsi dalam bahasa Go.

Apakah pembolehubah rujukan?

Dalam sesetengah bahasa pembangunan (seperti C++), alias boleh diisytiharkan untuk pembolehubah sedia ada Alias ​​ini dipanggil pembolehubah rujukan.

 #include <stdio.h>
 
 int main() {
        int a = 10;
         int &b = a;
         int &c = b;
 
         printf("%p %p %p\n", &a, &b, &c); // 0x7ffe114f0b14 0x7ffe114f0b14 0x7ffe114f0b14
         return 0;
}

Anda boleh melihat bahawa a, b dan c semua menunjuk ke lokasi memori yang sama. Menulis kepada a mempengaruhi b dan c. Ini berguna apabila anda ingin mengisytiharkan pembolehubah rujukan dalam skop yang berbeza - iaitu apabila fungsi dipanggil.

Bahasa Go tidak mempunyai pembolehubah rujukan

Tidak seperti C++, setiap pembolehubah yang ditakrifkan dalam program Go menduduki lokasi memori yang unik.

package main

import "fmt"

func main() {
        var a, b, c int
        fmt.Println(&a, &b, &c) // 0x1040a124 0x1040a128 0x1040a12c
}

Tidak mungkin untuk mencipta dua pembolehubah yang berkongsi lokasi memori yang sama. Adalah mungkin untuk mencipta dua pembolehubah yang menghala ke lokasi memori yang sama, tetapi ini tidak sama dengan dua pembolehubah yang berkongsi lokasi memori yang sama.

 package main
 
 import "fmt"
 
 func main() {
        var a int
        var b, c = &a, &a
        fmt.Println(b, c)   // 0x1040a124 0x1040a124
        fmt.Println(&b, &c) // 0x1040c108 0x1040c110
}

Dalam kod di atas, b dan c kedua-duanya mempunyai nilai yang sama - iaitu alamat pembolehubah a, tetapi a dan c disimpan di lokasi yang berbeza dalam ingatan. Menukar kandungan b tidak akan menjejaskan c.

Peta dan Saluran ialah pembolehubah rujukan, bukan?

Salah! peta dan saluran bukan rujukan Jika ada, kod berikut akan menghasilkan palsu.

package main

import "fmt"

func fn(m map[int]int) {
        m = make(map[int]int)
}

func main() {
        var m map[int]int
        fn(m)
        fmt.Println(m == nil)
}

Jika peta m ialah pembolehubah rujukan gaya C++, m yang diisytiharkan dalam main() dan m yang diisytiharkan dalam fn() akan berkongsi ruang memori yang sama. Walau bagaimanapun, kerana memberikan nilai kepada m dalam fn() tidak menjejaskan m dalam main(), kita dapat melihat bahawa peta bukan pembolehubah rujukan.

Ringkasan

Go tidak melepasi rujukan kerana Go tidak mempunyai pembolehubah rujukan.

[Cadangan berkaitan: Pergi tutorial video, Pengajaran pengaturcaraan]

Atas ialah kandungan terperinci Adakah terdapat rujukan lewat dalam bahasa go?. 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