Rumah > Artikel > pembangunan bahagian belakang > Nilai indeks atau rujukan Golang Slice?
editor php Xigua akan memperkenalkan anda kepada masalah indeks Slice di Golang. Di Golang, Slice ialah tatasusunan dinamik fleksibel yang boleh menambah, memadam, mengubah suai dan bertanya data dengan mudah. Tetapi apabila menggunakan Slice, anda kadangkala menghadapi masalah pengindeksan, iaitu sama ada nilai yang diindeks ialah salinan nilai atau rujukan. Memahami perbezaan antara nilai indeks dan rujukan adalah penting untuk menggunakan Slice dengan betul. Seterusnya, kami akan meneroka isu ini secara terperinci untuk membantu anda memahami dan menggunakan Slice dengan lebih baik.
Saya sedang belajar dan keliru dengan "perkara" yang kami dapat daripada pengindeksan kepingan.
Katakan kita mempunyai struktur jenis bag
:
type bag struct { item string }
Kemudian, katakan kami mempunyai senarai bagasi:
itembag := []bag{ {item: "item1"}, {item: "item2"}, {item: "item3"} }
Sekarang, saya cuba menukar kandungan elemen pertama pembolehubah itembag
. Secara naif, saya melakukan perkara berikut:
item1 := itembag[0] item1.item = "not item1" fmt.printf("itembag[0].item == 'not item1'? %v", itembag[0].item == "not item1") // console print false
Jawapan yang saya dapat adalah salah kerana (saya rasa, sila betulkan saya jika saya salah) apabila kita melakukannya item1 := itembag[0]
时,我们正在复制 itembag[0]
的值并且将其分配给 item1
. Saya percaya ini adalah tentang blog ini.
Untuk membuktikan ini, saya cuba mendapatkan penunjuk itembag[0]
dan mengubah suai nilainya, dan voila, saya mencapai apa yang saya mahu lakukan:
item1 := &itembag[0] item1.item = "not item1" fmt.printf("itembag[0].item == 'not item1'? %v", itembag[0].item == "not item1") // console print true
Ini masuk akal jika kita mengatakan bahawa apabila kita melakukan indeks hirisan (iaitu hirisan[indeks]) kita akan mendapat salinan nilainya dan bukannya item asas.
Sekarang apabila saya lakukan:
itemBag[0].item = "not item1" fmt.Printf("itemBag[0].item == 'not item1'? %v", itemBag[0].item == "not item1")
Hasilnya adalah benar
, yang tidak seperti yang saya jangkakan. Kerana ia kelihatan seperti true
,这不是我所期望的。 因为它看起来像 itembag[0].item
在语法上与我首先将 itembag[0]
secara sintaksis sama seperti jika saya mula-mula menetapkan kepada pembolehubah dan kemudian merujuk item asasnya.
Saya rasa seperti saya kehilangan satu bab penting dalam kursus golang, sila, sebarang ubah hala/penjelasan akan sangat dihargai!
Mencuba googling sesuatu seperti "pass slice index by reference" tetapi tidak dapat menentukan kata kunci yang tepat di google. PenyelesaianOperasi tugasan menyalin nilai. Jadi apabila anda lakukan:
item1 = itembag[0]
itembag[0]
处创建该对象的副本,其类型为 bag
。现在 item1
Anda mencipta salinan objek di dengan jenis . Kini item1
mempunyai salinannya dan sebarang pengubahsuaian yang anda buat padanya akan dibuat pada salinan itu. itempr
。当执行itempr.item="x"
时,相当于(*itempr).item=x
itemptr = &itembag[0]Bahagian kanan tugasan ialah penuding, jadi operasi ini mencipta salinan penuding itu dan menetapkannya kepada
, sekali gus mengubah suai kandungan penuding. itembag[0]
ialah nilai yang boleh dialamatkan, iaitu anda boleh mendapatkan alamatnya.
https://www.php.cn/link/753a043674f0193523abc1bbce678686itembag[0].item
juga merupakan nilai yang boleh dialamatkan, jadi anda boleh menetapkan sesuatu padanya dan ia akan ditunjukkan dalam kepingan itu sendiri.
Walau bagaimanapun, yang berikut bukan nilai yang boleh ditangani: m[1]
m:=map[int]bag{1:bag{item:"str"}} m[1].item="str1"Ini kerana
mengembalikan salinan nilai dalam peta, dan nilai yang diberikan kepadanya akan hilang. Namun, masalah berikut boleh diselesaikan: bag
的 item
m:=map[int]*bag{1:&bag{item:"str"}} m[1].item="str1"Ini akan menetapkan medan
Atas ialah kandungan terperinci Nilai indeks atau rujukan Golang Slice?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!