По значению, через append и по указателю

Что выведетMiddleбесплатно02-t022

Четыре замыкания по-разному изменяют один слайс из одного элемента: индекс по значению; append + индекс по значению; индекс по указателю; append + индекс по указателю. Что выведет программа?

main.gogo
1package main2 3import "fmt"4 5func main() {6	byVal := func(xs []int) {7		xs[0]++8	}9 10	byValAppend := func(xs []int) {11		xs = append(xs, 500)12		xs[0]++13	}14 15	byPtr := func(xs *[]int) {16		(*xs)[0]++17	}18 19	byPtrAppend := func(xs *[]int) {20		*xs = append(*xs, 500)21		(*xs)[0]++22	}23 24	data := []int{3}25 26	fmt.Println("len", "item[0]")27	byVal(data)28	fmt.Println(len(data), data[0])29 30	byValAppend(data)31	fmt.Println(len(data), data[0])32 33	byPtr(&data)34	fmt.Println(len(data), data[0])35 36	byPtrAppend(&data)37	fmt.Println(len(data), data[0])38}
Чем закончится программа?
Сначала подумай без запуска — на собесе компилятора не будет.