提问人:Jon Koenig 提问时间:2/7/2023 更新时间:2/7/2023 访问量:83
追加到指针切片
Appending to pointer slice
问:
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)
通过遵循调试器中的代码,我可以看到,当追加发生时,存储在“现有”变量中的分类正在更新,但实际列表中的数据没有更新。
谁能告诉我哪里出了问题?
答:
1赞
JimB
2/7/2023
#1
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) {
...
评论
existing.Data = append(existing.Data, term)
Data
l.Taxonomies
Taxonomy
existing
Taxonomies []*Taxonomy