go ialah bahasa pengaturcaraan pertama saya dan saya cuba mempelajari petunjuk dengan menulis program yang menyusun maklumat berdasarkan taksonomi. Saya mengalami kesukaran untuk memahami cara melampirkan pada kepingan penunjuk.
type list struct { taxonomies []taxonomy } func (l *list) add(t taxonomy) { var exists bool var existing *taxonomy for _, taxonomy := range l.taxonomies { if taxonomy.name == t.name { exists = true existing = &taxonomy } } if exists { for _, term := range t.data { termexists := false for _, existingterm := range existing.data { if existingterm.name == term.name { termexists = true break } } if termexists { continue } (*existing).data = append((*existing).data, term) } } else { l.taxonomies = append(l.taxonomies, t) } } type taxonomy struct { name string data []term } type term struct { name, link string }
Saya rasa masalahnya di bahagian bawah, baris ini:
(*existing).Data = append((*existing).Data, term)
Dengan mengesan kod dalam penyahpepijat, saya dapat melihat bahawa apabila penambahan berlaku, taksonomi yang disimpan dalam pembolehubah "sedia ada" sedang dikemas kini, tetapi data dalam senarai sebenar tidak.
Boleh sesiapa beritahu saya di mana silap saya?
l.taxonomies
是 []taxonomy
,因此 taxonomy
值将是该元素的副本,对该副本的更改不会反映在原始 list
nilai.
Anda boleh beralih menggunakan indeks untuk mengelakkan penyalinan nilai
for i := range l.taxonomies { if l.taxonomies[i].name == t.name { exists = true existing = &l.taxonomies[i] } }
Walau bagaimanapun, masih boleh menyalin data yang dihantar ke kaedah seperti append
. Sebaliknya, lebih baik menggunakan penunjuk sepanjang:
type List struct { Taxonomies []*Taxonomy } func (l *List) Add(t *Taxonomy) { ...
Atas ialah kandungan terperinci Lampirkan pada hirisan penunjuk. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!