Rumah > pembangunan bahagian belakang > Golang > Mengapa tidak mengubah suai struct dalam gelung julat Go mengemas kini kepingan asal?

Mengapa tidak mengubah suai struct dalam gelung julat Go mengemas kini kepingan asal?

DDD
Lepaskan: 2024-12-20 10:45:09
asal
502 orang telah melayarinya

Why doesn't modifying a struct in a Go range loop update the original slice?

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

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

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

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

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!

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