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 ответов

47 просмотров

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

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 - он не очевидный, да 🙂

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

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

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта