Rumah >pembangunan bahagian belakang >Golang >Mengapa tidak mengubah suai struct dalam gelung julat Go mengemas kini kepingan asal?
Ringing Over Structure in Go
In Go, apabila julat di atas sepotong struktur, nilai yang diperoleh daripada pembolehubah julat adalah salinan. Oleh itu, sebarang pengubahsuaian yang dibuat kepada nilai ini tidak akan menjejaskan kepingan asal.
Pertimbangkan contoh berikut:
package main import ( "fmt" ) type myStruct struct { Name string Count int } func main() { chartRecords := []myStruct{} for i := 0; i < 5; i++ { n := myStruct{Count: i, Name: fmt.Sprintf("Joe%2d", i)} chartRecords = append(chartRecords, n) } fmt.Printf("======ORIGINAL VALUES========\n") for _, elem := range chartRecords { fmt.Printf("No: %2d | Count: %2d | Name = %s\n", elem.Count, elem.Name) } fmt.Printf("======MODIFIED VALUES EXPECTED========\n") for _, elem := range chartRecords { elem.Count++ fmt.Printf("No: %2d | Count: %2d | Name = %s\n", elem.Count, elem.Name) } fmt.Printf("======CHECK AGAIN AND VALUES ARE BACK TO ORIGINAL========\n") for _, elem := range chartRecords { fmt.Printf("No: %2d | Count: %2d | Name = %s\n", elem.Count, elem.Name) } }
Menjalankan kod ini akan menghasilkan output berikut:
======ORIGINAL VALUES======== No: 0 | Count: 0 | Name = Joe 0 No: 1 | Count: 1 | Name = Joe 1 No: 2 | Count: 2 | Name = Joe 2 No: 3 | Count: 3 | Name = Joe 3 No: 4 | Count: 4 | Name = Joe 4 ======MODIFIED VALUES EXPECTED======== No: 1 | Count: 1 | Name = Joe 0 No: 2 | Count: 2 | Name = Joe 1 No: 3 | Count: 3 | Name = Joe 2 No: 4 | Count: 4 | Name = Joe 3 No: 5 | Count: 5 | Name = Joe 4 ======CHECK AGAIN AND VALUES ARE BACK TO ORIGINAL======== No: 0 | Count: 0 | Name = Joe 0 No: 1 | Count: 1 | Name = Joe 1 No: 2 | Count: 2 | Name = Joe 2 No: 3 | Count: 3 | Name = Joe 3 No: 4 | Count: 4 | Name = Joe 4
Seperti yang anda lihat, nilai dalam kepingan cartaRecords tidak diubah suai, walaupun kami menambah medan Kiraan bagi setiap elemen dalam julat. Ini kerana elem pembolehubah julat ialah salinan elemen asal dalam kepingan.
Untuk mengemas kini kepingan asal, anda perlu menetapkan semula elemen yang dikemas kini kepada kepingan pada indeks yang sepadan:
for i, elem := range chartRecords { elem.Count++ chartRecords[i] = elem }
Dengan pembetulan ini, menjalankan kod sekali lagi akan menghasilkan output berikut:
======ORIGINAL VALUES======== No: 0 | Count: 0 | Name = Joe 0 No: 1 | Count: 1 | Name = Joe 1 No: 2 | Count: 2 | Name = Joe 2 No: 3 | Count: 3 | Name = Joe 3 No: 4 | Count: 4 | Name = Joe 4 ======MODIFIED VALUES EXPECTED======== No: 1 | Count: 1 | Name = Joe 0 No: 2 | Count: 2 | Name = Joe 1 No: 3 | Count: 3 | Name = Joe 2 No: 4 | Count: 4 | Name = Joe 3 No: 5 | Count: 5 | Name = Joe 4 ======CHECK AGAIN AND VALUES ARE STILL MODIFIED======== No: 1 | Count: 1 | Name = Joe 0 No: 2 | Count: 2 | Name = Joe 1 No: 3 | Count: 3 | Name = Joe 2 No: 4 | Count: 4 | Name = Joe 3 No: 5 | Count: 5 | Name = Joe 4
Kini, nilai dalam kepingan cartaRecords ialah dikemas kini seperti yang dijangkakan.
Atas ialah kandungan terperinci Mengapa tidak mengubah suai struct dalam gelung julat Go mengemas kini kepingan asal?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!