Rumah >pembangunan bahagian belakang >Golang >Mengapa Pengubahsuaian Nilai Struktur dalam Gelung Go Range Tidak Mengubah Slice Asal?
Mengapa Nilai dalam Julat Struktur Jenis Tidak Boleh Diubahsuai
Dalam Go, julat struktur jenis, seperti kepingan, mencipta melihat data asas dan bukannya salinan. Apabila melelaran pada julat, sebarang pengubahsuaian yang dibuat pada pembolehubah lelaran hanya menjejaskan paparan tertentu itu, bukan data asal.
Untuk memahami perkara ini, pertimbangkan coretan kod berikut:
type myStruct struct { Name string Count int } func main() { chartRecords := []myStruct{} for i := 0; i < 4; i++ { n := myStruct{Count: i, Name: fmt.Sprintf("Joe%2d", i)} chartRecords = append(chartRecords, n) } for _, elem := range chartRecords { elem.Count = 0 fmt.Println(elem) } fmt.Println(chartRecords) }
Ini coretan kod berulang dalam julat chartRecords, mengubah suai medan Kiraan setiap pembolehubah lelaran kepada 0 dan mencetak pembolehubah diubah suai. Walau bagaimanapun, apabila kepingan cartaRecords asal dicetak, ia menunjukkan bahawa nilai medan Kira tidak berubah.
Ini kerana gelung for dengan klausa julat mencipta salinan setiap elemen dalam julat. Pengubahsuaian yang dibuat pada salinan tidak menjejaskan elemen asal. Untuk mengubah suai elemen asal, anda perlu mengemas kininya secara eksplisit dengan mengakses indeksnya dalam kepingan. Sebagai contoh:
func main() { chartRecords := []myStruct{} for i := 0; i < 4; i++ { n := myStruct{Count: i, Name: fmt.Sprintf("Joe%2d", i)} chartRecords = append(chartRecords, n) } for i, elem := range chartRecords { chartRecords[i] = myStruct{Count: 0, Name: elem.Name} } fmt.Println(chartRecords) }
Dalam contoh ini, gelung for dengan klausa julat digunakan untuk lelaran pada julat cartaRekod. Untuk setiap lelaran, indeks digunakan untuk mengakses elemen asal dalam kepingan dan nilai elemen dikemas kini. Pendekatan ini memastikan bahawa pengubahsuaian ditunjukkan dalam kepingan cartaRecords asal.
Atas ialah kandungan terperinci Mengapa Pengubahsuaian Nilai Struktur dalam Gelung Go Range Tidak Mengubah Slice Asal?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!