我无法理解以下结果。我期待代码
package main
import "fmt"
func main() {
fruits := []string{"apple", "banana", "orange", "kiwi", "ananas"}
for i, _ := range fruits {
s := append(fruits[:i], fruits[i+1:]...)
fmt.Println(s)
}
}
返回:
[banana orange kiwi ananas]
[apple orange kiwi ananas]
[apple banana kiwi ananas]
[apple banana orange ananas]
[apple banana orange kiwi]
而是返回:
[banana orange kiwi ananas]
[banana kiwi ananas ananas]
[banana kiwi ananas ananas]
[banana kiwi ananas ananas]
[banana kiwi ananas ananas]
我错过了什么?
注意:我注意寻找返回预期行为的代码,只是试图理解代码的作用。
游乐场:https://play.golang.org/p/CB73GYvY7aW
答案 0 :(得分:4)
正如规范所说:
追加内置函数将元素附加到切片的末尾。如果它具有足够的容量,则会复制目标以容纳新元素。如果没有,将分配新的底层数组。 Append返回更新的切片。
在您的情况下,底层切片总是足够的,因此每次都会修改它。根据规范,结果是可以预期的。
每个循环的结果:
[banana orange kiwi ananas] [banana orange kiwi ananas ananas]
[banana kiwi ananas ananas] [banana kiwi ananas ananas ananas]
[banana kiwi ananas ananas] [banana kiwi ananas ananas ananas]
[banana kiwi ananas ananas] [banana kiwi ananas ananas ananas]
[banana kiwi ananas ananas] [banana kiwi ananas ananas ananas]