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) {
...