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
Barbara Streisandasal
2024-12-20 19:05:11315semak imbas

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

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!

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