pointers - 变量中的 slice 指针在追加期间更改行为

标签 pointers go reference slice

我有点困惑为什么在尝试从 Go 中的 slice 中删除元素时会发生这种情况。

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

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:]...)
        }
    }
}

我认为这可行,但以这种方式引用 slice 元素会返回编译错误: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:]...)
        }
    }
}

为什么我需要在这个方法工作之前将 slice 设置为差异变量?行为不应该完全一样吗?

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

最佳答案

*p = append(*p[:i], *p[i+1:]...) 中的 slice 表达式优先于 *运算符(operator)。您需要将它们括在括号中。

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

关于pointers - 变量中的 slice 指针在追加期间更改行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48989713/

相关文章:

go - 使用 goroutines 复制子目录

c++ - 为什么从 const 方法返回的 string& 无法编译?

c - 到 "head"还是不到 "head"?

c++ - 强制转换 void 指针以检查内存对齐情况

c - 在堆栈上查找函数的根

c++ - 如何使用此 OpenMP 关键部分避免此原始指针?

c++ - C3681 标识符未找到

c - c中的&a,&a[0],a有什么区别

pointers - 如何将指针分配给 Go map

go - 如何在 GO 中初始化嵌套结构数组?