Почему такой вывод среза?

Я новичек в 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.

→ Ссылка