Почему такой вывод среза?
Я новичек в GO. И только изучаю срезы и никак не могу понять почему получается такой вывод среза a2.
CODE:
aSlice := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
a1 := aSlice[:5]
a2 := aSlice[6:]
n := append(a1, a2...)
fmt.Println("a1:", a1, "a2:", a2, "n:", n)
OUTPUT:
a1: [0 1 2 3 4] a2: [7 8 9 9] n: [0 1 2 3 4 6 7 8 9]
Почему не [6, 7, 8, 9]?
Ответы (1 шт):
Автор решения: SWEE
→ Ссылка
Возможно, ты знаешь, что вот так работает:
arr = []int{0, 1, 2, 3, 4, 5, 6}
a = arr[:3]
Print(a) // [0, 1, 2]
arr[1] = 3
Print(a) // [0, 3, 2]
Когда ты берешь a из arr, a присваевается lentgh 3, но capacity 7.
Append в свою очередь создает новое место для хранения слайса, только если a1 capacity было бы меньше, чем lenght n.
Поэтому при Append фактически что создается на адресе a - arr:
arr[:len(a1)+len(a2)] = a1 + a2
arr[:5+4] = arr[:5] + arr[6]
arr[:9] = 0 1 2 3 4 + 6 7 8 9
В результате:
arr = arr[:9] + arr[9:]
arr = 0 1 2 3 4 6 7 8 9 + 9
И когда ты выводишь a2, выводятся те данные, на которые ссылается a2 - arr[6:] - 7 8 9 9.
А n не хранит две 9, потому что capacity n = 9.