Nilai indeks atau rujukan Golang Slice?

王林
Lepaskan: 2024-02-09 08:42:17
ke hadapan
567 orang telah melayarinya

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

Kemudian, katakan kami mempunyai senarai bagasi:

itembag := []bag{
    {item: "item1"},
    {item: "item2"},
    {item: "item3"}
}
Salin selepas log masuk

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

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

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

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

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

sumber:stackoverflow.com
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!