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