Rumah > pembangunan bahagian belakang > Golang > Mengapa Gelung Go Range Saya Tidak Mengubah Suai Elemen Tatasusunan?

Mengapa Gelung Go Range Saya Tidak Mengubah Suai Elemen Tatasusunan?

Barbara Streisand
Lepaskan: 2024-12-17 18:47:11
asal
397 orang telah melayarinya

Why Does My Go Range Loop Not Modify Array Elements?

Alamat Pengembalian bukannya Nilai untuk Rujukan Julat

Pertimbangkan situasi di mana pernyataan julat mengembalikan salinan nilai dan bukannya alamat asal . Ini boleh membawa kepada tingkah laku yang tidak dijangka, seperti yang dilihat dalam kod Go berikut:

import "fmt"

type MyType struct {
    field string
}

func main() {
    var array [10]MyType

    for _, e := range array {
        e.field = "foo"
    }

    for _, e := range array {
        fmt.Println(e.field)
        fmt.Println("--")
    }
}
Salin selepas log masuk

Dalam contoh ini, tujuannya adalah untuk mengubah suai sifat "medan" setiap elemen dalam tatasusunan. Walau bagaimanapun, oleh kerana pernyataan julat mengembalikan salinan nilai, perubahan dibuat kepada salinan tempatan dan tidak menjejaskan tatasusunan asal. Akibatnya, output menunjukkan semua sifat "medan" sebagai mempunyai nilai lalai.

Untuk menangani isu ini, anda tidak boleh mengembalikan alamat item dalam gelung julat. Sebaliknya, anda harus lelaran melalui tatasusunan menggunakan indeks, seperti yang ditunjukkan di bawah:

func main() {
    var array [10]MyType

    for idx, _ := range array {
        array[idx].field = "foo"
    }

    for _, e := range array {
        fmt.Println(e.field)
        fmt.Println("--")
    }
}
Salin selepas log masuk

Dengan menggunakan indeks dan bukannya nilai dalam gelung for, anda memastikan bahawa perubahan yang dibuat pada sifat "medan" dicerminkan dalam tatasusunan asal.

Atas ialah kandungan terperinci Mengapa Gelung Go Range Saya Tidak Mengubah Suai Elemen Tatasusunan?. 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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan