Rumah > pembangunan bahagian belakang > Golang > Mengapa Pengubahsuaian Nilai Struktur dalam Gelung Go Range Tidak Mengubah Slice Asal?

Mengapa Pengubahsuaian Nilai Struktur dalam Gelung Go Range Tidak Mengubah Slice Asal?

Barbara Streisand
Lepaskan: 2024-12-20 19:05:11
asal
335 orang telah melayarinya

Why Doesn't Modifying Struct Values in a Go Range Loop Change the Original Slice?

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

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

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!

sumber:php.cn
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan