Pertanyaan pengaturcaraan ini timbul daripada ketidakupayaan untuk mengubah nilai dalam julat jenis berstruktur dalam bahasa pengaturcaraan Go. Memahami isu ini memerlukan pemeriksaan lebih dekat tentang cara hirisan dan julat beroperasi dalam Go.
Walaupun kaedah awal anda memuatkan data ke dalam tatasusunan cartaRecords, mengubah suai nilai dalam gelung nampaknya tidak mempunyai sebarang kesan. Output, bukannya mencerminkan nilai yang diubah suai, mengekalkan nilai asal.
Kekeliruan berpunca daripada cara Go mengendalikan kepingan dan julat. Untuk klausa julat dalam pernyataan for, Go memberikan nilai lelaran kepada pembolehubah lelaran yang sepadan, tetapi perubahan tersebut hanya digunakan dalam blok. Pembolehubah lelaran ini adalah salinan, bukan rujukan kepada elemen hirisan asal.
Untuk membuat perubahan kekal pada elemen hirisan, nilai yang diubah suai daripada pembolehubah lelaran mesti diperuntukkan semula secara eksplisit ke dalam kepingan. Berikut ialah kod yang dikemas kini:
for i, elem := range chartRecords { elem.Count = modMe(mod, i) chartRecords[i] = elem }
Dalam gelung yang diubah suai ini, nilai yang diubah suai dalam elem pembolehubah lelaran diperuntukkan semula ke dalam carta hirisan asalRekod, memastikan perubahan itu berterusan.
Atas ialah kandungan terperinci Mengapakah Saya Tidak Boleh Mengubah Suai Secara Terus Nilai dalam Gelung Go Range Atas Slice Struct?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!