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

42 просмотра

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

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

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

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

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
Ребят в СИ можно реализовать ООП?
Николай
33
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
у вас два процесса. один посылает другому сигнал. у вас есть код обоих процессов? если всё не так - расскажите как оно на самом деле. а именно кто кому чего, есть-ли консоли,...
Karagy
6
Карта сайта