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
DDDasal
2024-12-20 10:45:09487semak imbas

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)
    }
}

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!

Kenyataan:
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