Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Nilai indeks atau rujukan Golang Slice?

Nilai indeks atau rujukan Golang Slice?

王林
王林ke hadapan
2024-02-09 08:42:17582semak imbas

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.

Kandungan soalan

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.

Penyelesaian

Operasi tugasan menyalin nilai. Jadi apabila anda lakukan:

item1 = itembag[0]
itembag[0] 处创建该对象的副本,其类型为 bag。现在 item1Anda 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/753a043674f0193523abc1bbce678686

itembag[0].item

ungkapan

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: bagitem

m:=map[int]*bag{1:&bag{item:"str"}}
m[1].item="str1"

Ini akan menetapkan medan item 🎜 dalam peta. 🎜

Atas ialah kandungan terperinci Nilai indeks atau rujukan Golang Slice?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam