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
Barbara Streisandasal
2024-12-17 18:47:11338semak imbas

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

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

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