170 похожих чатов

Func main() { workArray := make([]int, 0, 3) workArray =

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

23 ответов

38 просмотров

сам слайс передается не по указателю

Anton- Автор вопроса
Andrey Chernov
сам слайс передается не по указателю

передается структура слайс, которая содержит указатель на первый элемент базового массива, длина и капасити. так?

Стикер

add_el записывает данные в область памяти, но при этом не возвращает из функции обновление slice, где len теперь равен 2.

Anton- Автор вопроса

должен был, потому что workArray и slice в функции имеют одинаковый базовый массив, капасити 3, значит можем добавлять еще 2 элемента без создания нового базового массива. я хочу понять, почему он не меняется. до меня это не доходит

Anton- Автор вопроса
Илья О
add_el записывает данные в область памяти, но при ...

окей, тогда почему если передать в функцию так add_el(workArray[:1]), то базовый массив изменяется? я по прежнему ничего не возвращаю же

Anton
должен был, потому что workArray и slice в функции...

там выше хороший премер показывающий что указатель на элементы массива остался на месте и в его память добавились новые элементы, но длина слайса не является указателем и при передачи через параметр функции скопировалась в другую переменную - этот самый параметр

Anton
окей, тогда почему если передать в функцию так add...

workArray[:1] создает новый слайс с длинной 2

Anton- Автор вопроса
Илья О
workArray[:1] создает новый слайс с длинной 2

почему 2? вроде бы 1. и капасити 3

Anton
должен был, потому что workArray и slice в функции...

Так а кто - «он»? Как вы на этот вопрос ответите, так все очевидно станет

Anton- Автор вопроса
Daniel Podolsky
Так а кто - «он»? Как вы на этот вопрос ответите,...

слайс workArray. вроде ответил, а понятно не стало. поведение меняется в зависимости от того что передается в функцию. слайс или слайс слайса

Anton
слайс workArray. вроде ответил, а понятно не стало...

надеюсь, вы можете разобрать аналогично второй пример, и понять почему данные меняются

может быть, не len а cap ? хотя, я не уверен, что точно понял вопрос-ответ..

serg
может быть, не len а cap ? хотя, я не уверен, что ...

и len, и cap 🙂 но удивление вызывают эффекты вокруг len///

Anton- Автор вопроса

Стикер

изучите максимально внимательно https://go.dev/play/p/9LBPtfH42UZ

Anton- Автор вопроса
Daniel Podolsky
изучите максимально внимательно https://go.dev/pl...

у меня вывод в иде отличается от ваших комментов у принтов

Anton
у меня вывод в иде отличается от ваших комментов у...

это ваши комменты у принтов, я их не правил

Anton- Автор вопроса
Daniel Podolsky
это ваши комменты у принтов, я их не правил

спасибо за разъяснения, теперь все понял. ваш пример с workArray[:cap(workArray)] помог, все-таки я неправильно понимал что такое срез)

Anton
спасибо за разъяснения, теперь все понял. ваш прим...

вот этот момент, что срез от среза можно взять не до len, а до cap - он не очевидный, да 🙂

Похожие вопросы

Обсуждают сегодня

Здравствуйте, вопрос по структурам данных. Были у вас случаи, когда пришлось писать деревья или двунаправленные списки?
/ /
48
Всем привет! Скажите, никто не пытался уменьшить размер процесса ssl, которые ассоциируется с открытым соединением (не помню точное название этого процесса, но там была какая-...
Алексей
20
а проверьте, собирается ли у кого сейчас транк лазаря через делюкс? у меня вот: fpcupdeluxe: info: Lazarus Native Installer (BuildModuleCustom: UserIDE): LazBuild: building Us...
Iluha Companets
20
Мне тут приспичило встроить в программу форматировние текста SQL, расставить переносы строк и отступы так, чтобы лучше читалось. Я что-то свое изобразил, оно после ключевых сл...
Sergey Bodrov
11
This is a big issue. Just by being a citizen of a country, you are denied to contribute to Open Source software: https://youtu.be/L5Ec5jrpLVk?si=1iIuHnMPbCB4anV-
Sharuzzaman Ahmat Raslan
72
добрый день. возможно ли изменить цвет окон лазаруса? Как?
Budemposmotret
35
Господа, а кто-нибудь сталкивался с размещением на TTabControl/TTabSheet множества контролов (> 100) с последующими External: Access violation? Вот буквально на ровном месте. ...
Dmitry
29
А какие существуют способы обработки ошибок выделения памяти в ядре? Т.е., допустим, есть функция, которая возвращает адрес свободной страницы в физической памяти и диапазон в...
disba1ancer
51
Добрый день. Опять снова хочу обратиться к вам за помощью. После создания проэкта stack new, lazy.nvim + nvim-lspconfig/haskell-tools + hlint, ormolu из mason + hls из ghcup ...
Nannk
8
Does anyone have some zeroday's left?
Wito!d ♥️🩷
44
Карта сайта