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
DDDasal
2024-11-16 15:07:03332semak imbas

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

}

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

}

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!

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