I have trouble understanding the following result. I am expecting the code
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)
}
}
to return :
[banana orange kiwi ananas]
[apple orange kiwi ananas]
[apple banana kiwi ananas]
[apple banana orange ananas]
[apple banana orange kiwi]
instead it returns :
[banana orange kiwi ananas]
[banana kiwi ananas ananas]
[banana kiwi ananas ananas]
[banana kiwi ananas ananas]
[banana kiwi ananas ananas]
what am i missing? Note: I am note looking for code that returns the expected behavior, just trying to understand what the code does. Playground : https://play.golang.org/p/CB73GYvY7aW
As the spec say:
The append built-in function appends elements to the end of a slice. If it has sufficient capacity, the destination is resliced to accommodate the new elements. If it does not, a new underlying array will be allocated. Append returns the updated slice.
In your case, the underlying slice is always sufficient, so it modifies it every time. The result is expectable according to the spec.
The s/fruit of each loop:
[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]