在附加过程中进行变更变化行为中的切片指针



我很困惑为什么在尝试从切片中删除元素时会发生这种情况。

作为一个简化的示例,我有以下数据结构:

type Person struct {
    Name string
}
type People []Person

我想添加一种方法,以从people.Remove("Sam")的人列表中删除一个名称:

的人
func (p *People) Remove(name string) {
    for i, person := range *p {
        if person.Name == name {
            // Doesn't work
            *p = append(*p[:i], *p[i+1:]...)
        }
    }
}

我认为这会起作用,但是以这种方式引用切片元素会返回编译错误: cannot slice p (type *People)

所以,足够公平。但是,当我将*p设置为另一个变量(a(时,它的工作原理与预期完全合理:

func (p *People) Remove(name string) {
    for i, person := range *p {
        if person.Name == name {
            // Does work
            a := *p
            *p = append(a[:i], a[i+1:]...)
        }
    }
}

为什么在此方法起作用之前,我需要将切片设置为差异变量?行为不应该完全一样吗?

我可能在这里误解了一些基本的东西,所以如果有人可以解释为什么需要这一点,我很想知道。谢谢!

*p = append(*p[:i], *p[i+1:]...)中的切片表达式优先于*操作员。您需要将它们包装在括号中。

func (p *People) Remove(name string) {
    for i, person := range *p {
        if person.Name == name {
            // Doesn't work
            *p = append((*p)[:i], (*p)[i+1:]...)
        }
    }
}

https://play.golang.org/p/cbt65mcza4h

相关内容

  • 没有找到相关文章

最新更新