go 是我的第一種程式語言,我正在嘗試透過編寫一個根據分類法組織資訊的程式來學習指標。我在理解如何附加到指標切片時遇到一些困難。
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 }
我認為問題出在底部,這一行:
(*existing).Data = append((*existing).Data, term)
透過追蹤偵錯器中的程式碼,我可以看到當追加發生時,儲存在「現有」變數中的分類法正在更新,但實際清單中的資料並未更新。
誰能告訴我哪裡出錯了?
l.taxonomies
是[]taxonomy
,因此taxonomy
值將是該元素的副本,對該副本的變更不會反映在原始list
值中。
您可以使用索引進行迭代以避免複製值
for i := range l.taxonomies { if l.taxonomies[i].name == t.name { exists = true existing = &l.taxonomies[i] } }
但是,仍然可以複製傳遞給 append
等方法的資料。相反,最好在整個過程中使用指標:
type List struct { Taxonomies []*Taxonomy } func (l *List) Add(t *Taxonomy) { ...
以上是附加到指標切片的詳細內容。更多資訊請關注PHP中文網其他相關文章!