append(workArray, 1)
fmt.Println(workArray) // [1]
add_el(workArray)
fmt.Println(workArray) // [1]
}
func add_el(slice []int) {
_ = append(slice, 6)
}
объясните плиз, почему здесь после вызова add_el слайс workArray не изменится? у нас же в функции slice имеет указатель на первый элемент базового массива, такой же, как и у workArray
сам слайс передается не по указателю
передается структура слайс, которая содержит указатель на первый элемент базового массива, длина и капасити. так?
Стикер
add_el записывает данные в область памяти, но при этом не возвращает из функции обновление slice, где len теперь равен 2.
должен был, потому что workArray и slice в функции имеют одинаковый базовый массив, капасити 3, значит можем добавлять еще 2 элемента без создания нового базового массива. я хочу понять, почему он не меняется. до меня это не доходит
окей, тогда почему если передать в функцию так add_el(workArray[:1]), то базовый массив изменяется? я по прежнему ничего не возвращаю же
там выше хороший премер показывающий что указатель на элементы массива остался на месте и в его память добавились новые элементы, но длина слайса не является указателем и при передачи через параметр функции скопировалась в другую переменную - этот самый параметр
workArray[:1] создает новый слайс с длинной 2
почему 2? вроде бы 1. и капасити 3
у меня не меняется
https://go.dev/play/p/e1660l2SJq1
Так а кто - «он»? Как вы на этот вопрос ответите, так все очевидно станет
слайс workArray. вроде ответил, а понятно не стало. поведение меняется в зависимости от того что передается в функцию. слайс или слайс слайса
надеюсь, вы можете разобрать аналогично второй пример, и понять почему данные меняются
может быть, не len а cap ? хотя, я не уверен, что точно понял вопрос-ответ..
и len, и cap 🙂 но удивление вызывают эффекты вокруг len///
Стикер
изучите максимально внимательно https://go.dev/play/p/9LBPtfH42UZ
у меня вывод в иде отличается от ваших комментов у принтов
это ваши комменты у принтов, я их не правил
спасибо за разъяснения, теперь все понял. ваш пример с workArray[:cap(workArray)] помог, все-таки я неправильно понимал что такое срез)
вот этот момент, что срез от среза можно взять не до len, а до cap - он не очевидный, да 🙂
Обсуждают сегодня