追加到指针切片

Appending to pointer slice

提问人:Jon Koenig 提问时间:2/7/2023 更新时间:2/7/2023 访问量:83

问:

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)

通过遵循调试器中的代码,我可以看到,当追加发生时,存储在“现有”变量中的分类正在更新,但实际列表中的数据没有更新。

谁能告诉我哪里出了问题?

Go 指针 追加切

评论

0赞 JimB 2/7/2023
不需要取消引用,这和写 . 已更新,那么您所说的“实际列表”是什么?使这成为一个最小的可重复示例,准确显示您正在做什么可能会有所帮助。existing.Data = append(existing.Data, term)Data
0赞 Jon Koenig 2/7/2023
感谢您到目前为止的帮助。我想我不明白指针在这种情况下是如何工作的。我引用了存储在变量“existing”中的一些分类结构,并且我打算在附加到现有时更新该分类的 Data 属性。数据 -- 但是,似乎只有现有 Data 属性被修改。我会举一个更好的例子。
0赞 JimB 2/7/2023
哦,“实际列表”是?您正在复制该值,因此您只是更新该副本。当它是指向本地副本的指针时,它是否是指针并不重要。l.TaxonomiesTaxonomyexisting
0赞 Jon Koenig 2/7/2023
你好,又来了。我仍然不完全理解,但那是在我身上。我会继续研究它,直到它有意义。感谢您指出问题。
0赞 JimB 2/7/2023
能满足您的要求吗?(另一种选择是使用 ,这可能是大多数人开始的默认设置)Taxonomies []*Taxonomy

答:

1赞 JimB 2/7/2023 #1

l.Taxonomies是一个 ,因此该值将是元素的副本,并且对该副本的更改不会反映在原始值中。[]TaxonomytaxonomyList

可以使用索引进行迭代,以避免复制值

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