добавить к новому срезу повлиять на оригинальный срез - PullRequest
0 голосов
/ 01 декабря 2018

У меня есть следующий код, который вызывает странный результат.Я не могу понять, почему:

func main() {
    var s = []int{2, 3}
    var s1 = append(s, 4)
    var a = append(s1, 5)
    var b = append(s1, 6)
    fmt.Println(s)
    fmt.Println(s1)
    fmt.Println(a)
    fmt.Println(b)
}

Это приводит к:

[2 3]
[2 3 4]
[2 3 4 6]
[2 3 4 6]

Мой вопрос: почему a не [2 3 4 5], а [2 3 4 6]?Я знаю, что я могу добавить изменения, но как.Это ошибка, потому что я никогда не менял напрямую и, очевидно, я не хочу, чтобы это произошло?

1 Ответ

0 голосов
/ 02 декабря 2018

Имейте в виду, что срез представляет собой структуру из 3 полей.

  • указатель на базовый массив
  • длина среза
  • емкостьФункция slice

append () может либо изменить свой аргумент на месте, либо вернуть копию своего аргумента с дополнительной записью, в зависимости от размера и емкости своего ввода.Функция append () создает новый срез, если длина среза превышает длину массива, указанного срезом.

...