Rumah > pembangunan bahagian belakang > Golang > Mengapa Pengubahsuaian Nilai dalam Gelung Julat Go Tidak Mengubah Tatasusunan Asal?

Mengapa Pengubahsuaian Nilai dalam Gelung Julat Go Tidak Mengubah Tatasusunan Asal?

Susan Sarandon
Lepaskan: 2024-12-18 04:04:09
asal
729 orang telah melayarinya

Why Doesn't Modifying Values in Go's Range Loop Change the Original Array?

Rujukan Julat Sebaliknya Nilai

Dalam Go, kata kunci julat berulang mengikut jujukan, seperti tatasusunan atau kepingan dan menyediakan akses kepada kedua-dua kunci (indeks) dan nilai setiap elemen. Walau bagaimanapun, atas sebab prestasi, kata kunci julat beroperasi pada salinan nilai asal. Ini bermakna sebarang pengubahsuaian yang dibuat kepada nilai yang dikembalikan mengikut julat tidak akan ditunjukkan dalam tatasusunan asal.

Contoh

Pertimbangkan kod berikut:

package main

import "fmt"

type MyType struct {
    field string
}

func main() {
    var array [10]MyType

    // Attempting to modify a value returned by range
    for _, e := range array {
        e.field = "foo"
    }

    // Printing the values after the range loop
    for _, e := range array {
        fmt.Println(e.field)
        fmt.Println("--")
    }
}
Salin selepas log masuk

Menjalankan kod ini akan mencetak "000000" untuk semua elemen kerana pengubahsuaian yang dibuat pada e.field dalam gelung julat pertama digunakan kepada salinan dan tidak menjejaskan nilai asal dalam tatasusunan.

Penyelesaian

Untuk mengubah suai nilai tatasusunan menggunakan gelung julat, anda perlu menggunakan indeks tatasusunan bukannya nilai yang dikembalikan mengikut julat. Ini boleh dicapai dengan menangkap indeks menggunakan _ pemegang tempat dalam gelung julat.

package main

import "fmt"

type MyType struct {
    field string
}

func main() {
    var array [10]MyType

    // Using the array index to modify values
    for idx, _ := range array {
        array[idx].field = "foo"
    }

    // Printing the values after the range loop
    for _, e := range array {
        fmt.Println(e.field)
        fmt.Println("--")
    }
}
Salin selepas log masuk

Kod yang diubah suai ini akan berjaya menukar nilai medan untuk semua elemen dalam tatasusunan dan mencetak "foo" untuk setiap elemen.

Atas ialah kandungan terperinci Mengapa Pengubahsuaian Nilai dalam Gelung Julat Go Tidak Mengubah Tatasusunan 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