删除切片中的元素
func main() { a := []string{"Hello1", "Hello2", "Hello3"} fmt.Println(a) // [Hello1 Hello2 Hello3] a = append(a[:0], a[1:]...) fmt.Println(a) // [Hello2 Hello3] }
如何删除与追加function的伎俩?
看起来,它抓住了第一个元素(空数组)之前的所有东西,
然后在第一个元素(位置零)
(点点)做什么?
其中a
是切片,而i
是要删除的元素的索引:
a = append(a[:i], a[i+1:]...)
...
是Go中可变参数的语法。
基本上,当定义一个函数的时候,它把你传递的所有参数放到这个types的一个片段中。 通过这样做,您可以根据需要传递尽可能多的参数(例如, fmt.Println
可以根据需要采用fmt.Println
参数)。
现在,当调用一个函数时, ...
做相反的事情:它将解包一个片段并将它们作为单独的parameter passing给一个可变参数函数。
那么这条线是做什么的:
a = append(a[:0], a[1:]...)
基本上是:
a = append(a[:0], a[1], a[2])
现在,你可能想知道,为什么不做呢
a = append(a[:1]...)
那么, append
的函数定义是
func append(slice []Type, elems ...Type) []Type
所以第一个参数必须是正确types的一个分片,第二个参数是可变参数,所以我们传入一个空的分片,然后解压其余的分片来填充参数。
有两个选项:
– 答:你在乎保留数组顺序:
a = append(a[:i], a[i+1:]...) // or a = a[:i+copy(a[i:], a[i+1:])]
B:你不关心维持秩序(这可能更快):
a[i] = a[len(a)-1] // Replace it with the last one. a = a[:len(a)-1] // Chop off the last one.
如果您的数组是指针,请参阅链接以查看有关内存泄漏的含义。
…是可变参数的语法。
我认为它是由编译器使用slice( []Type)
,就像函数append:
func append(slice []Type, elems ...Type) []Type
当在“追加”中使用“elems”时,实际上它是一个切片([]types)。 所以“ a = append(a[:0], a[1:]...)
”的意思是“ a = append(a[0:0], a[1:])
”
a[0:0]
是一个没有任何内容的片段
a[1:]
是“Hello2 Hello3”
这是如何工作的
或者,因为您正在尝试查找要删除的元素的索引,
// na = new a, da = a that's to be deleted var na []string for _, v := range a { if v == da { continue } else { na = append(na, v) } } a = na
好吧,那算了。 对于这个话题是正确的答案,但对于问题主体来说是错误的答案