我有点困惑为什么在尝试从 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:]...)
}
}
}
关于pointers - 变量中的 slice 指针在追加期间更改行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48989713/