我很困惑为什么在尝试从切片中删除元素时会发生这种情况。
作为一个简化的示例,我有以下数据结构:
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