Rumah > pembangunan bahagian belakang > Golang > Mengapakah Mengemas kini Nilai dalam Go Struct Di Dalam Gelung Tidak Mengubah Suai Struktur Asal?

Mengapakah Mengemas kini Nilai dalam Go Struct Di Dalam Gelung Tidak Mengubah Suai Struktur Asal?

DDD
Lepaskan: 2024-11-16 15:07:03
asal
323 orang telah melayarinya

Why Does Updating Values in a Go Struct Inside a Loop Not Modify the Original Struct?

Kemas kini Nilai dalam Struct

Apabila berurusan dengan struct, mengemas kini nilai boleh menimbulkan cabaran. Pertimbangkan kod berikut:

ftr := FTR{}

err = yaml.Unmarshal([]byte(yamlFile), &ftr)

for index, element := range ftr.Mod {

    switch element.Type {
    case “aaa”, “bbbb”:
        element.Type = "cccc”
    case "htr”:
        element.Type = "com"
    case "no":
        element.Type = "jnodejs"
    case "jdb”:
        element.Type = "tomcat"
    }

}
Salin selepas log masuk

Selepas melaksanakan gelung ini, struct ftr asal tidak diubah suai, walaupun terdapat kemas kini yang jelas dalam gelung. Apakah yang boleh menjadi isu?

Isu: Penunjuk dan Struct Unwrap

Dalam Go, menghantar struct kepada fungsi mengikut nilai mencipta salinan struct, tidak seperti lulus dengan rujukan, yang menyediakan penunjuk kepada struct asal. Dalam kes ini, lelaran ke atas ftr.Mod menggunakan julat menghasilkan salinan elemen Mod, bermakna sebarang perubahan yang dibuat dalam gelung tidak ditunjukkan dalam struktur ftr asal.

Penyelesaian: Menggunakan Indeks dan Penunjuk

Untuk mengubah suai struktur ftr asal, ikuti langkah berikut:

  1. Gunakan indeks untuk lelaran: Lelaran ke atas indeks ftr.Mod dan bukannya elemen itu sendiri.
  2. Gunakan penunjuk: Tukar jenis Mod dalam definisi struktur kepada []*Mod.
  3. Akses penunjuk: Dalam gelung, akses nilai elemen Mod menggunakan penunjuk: *ftr.Mod[index].

Berikut ialah kod yang diubah suai:

type FTR struct {
    Id       string     
    Mod      []*Mod  // Use pointers for Mod
}

for index := range ftr.Mod{
    switch (*ftr.Mod[index]).Type {
    case “aaa”, “bbbb”:
        (*ftr.Mod[index]).Type = "cccc”
    case "htr”:
        (*ftr.Mod[index]).Type = "com"
    case "no":
        (*ftr.Mod[index]).Type = "jnodejs"
    case "jdb”:
        (*ftr.Mod[index]).Type = "tomcat"
    }

}
Salin selepas log masuk

Dengan menggunakan penunjuk, anda boleh terus ubah suai nilai dalam struct ftr asal.

Atas ialah kandungan terperinci Mengapakah Mengemas kini Nilai dalam Go Struct Di Dalam Gelung Tidak Mengubah Suai Struktur 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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan