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

For i, val := range someArr {

&someArr[i] != &val
}

подскажите, почему так? Почему при итерировании по массиву через for … range, val копируется?

32 ответов

34 просмотра

Чтобы ты неявно случайно не поменял значение в слайсе?

Павλо-🇺🇦 Автор вопроса
Askold
Чтобы ты неявно случайно не поменял значение в сла...

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

А что ещё можно ожидать, указатель?

Павλо-🇺🇦 Автор вопроса
Sergey
А что ещё можно ожидать, указатель?

я ожидал, что val будет исконным элементом массива. Тобишь, я ожидал, что &val == &someArr[i]

Павλо 🇺🇦
я ожидал, что val будет исконным элементом массива...

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

Павλо-🇺🇦 Автор вопроса
Askold
А с чего у вас такие ожидания, в каком языке при ц...

потому что я считал range сахаром над обычным сишным циклом, превращающий что-то вроде for index, value := range something в нечто for index := 0; index < len(something); index++ { value := something[index] ... }

Павλо 🇺🇦
потому что я считал range сахаром над обычным сишн...

вопрос остается открытым: https://goplay.space/#iZILFdLsTjb вы своим же примером подтвердили нелогичность ваших ожиданий

Павλо 🇺🇦
потому что я считал range сахаром над обычным сишн...

ну и окончательно, в си https://onlinegdb.com/-TiTAdgecI ваше "ожидение" тоже не работает)

Эт врооде на википедии даже описано - В цикле по коллекции переменная-значение является копией, а не ссылкой. В цикле вида «for index, value := range collection» переменная value является копией текущего элемента. Операция присваивания этой переменной нового значения доступна, но, вопреки ожиданиям, не приводит к изменению текущего элемента коллекции.

Askold
А с чего у вас такие ожидания, в каком языке при ц...

В языках где всё передаётся по ссылке создаётся такое ощущение. В том же php например.

В php по ссылке передаются только экземпляры классов)

Askold
В php по ссылке передаются только экземпляры класс...

не только, массивы тоже, пока вы не начнете их менять (copy on write)

Bat
не только, массивы тоже, пока вы не начнете их мен...

Ну вот в пхп и можно (не в си) использовать вот такую запись: foreach($arr as &$item). Я писал об этом

Павλо-🇺🇦 Автор вопроса
Askold
вопрос остается открытым: https://goplay.space/#iZ...

хм. А почему так? Мы ведь присваиваем переменной value значение конкретного элемента массива

Павλо-🇺🇦 Автор вопроса
Jasin Ka
Эт врооде на википедии даже описано - В цикле по ...

спасибо. Плохо, что мне пришлось эмпирическим путём к этому дойти

Павλо 🇺🇦
хм. А почему так? Мы ведь присваиваем переменной v...

Нет, := создает новую переменную с типом данных == типу элемента слайса (причем под капотом она создается 1 раз, и потом переиспользуется)

Павλо-🇺🇦 Автор вопроса
Askold
Нет, := создает новую переменную с типом данных ==...

то есть, := копирует оригинальный объект, и при всех остальных идентичных присваиваниях присваивает одну и ту же копию?

Короче говоря, ты скорее всего как пхпшник должен понимать, что по умолчанию в пхп неявно хранятся указатели на объекты (на другие типы данные по умолчанию хранятся значения). В го если тебе очень хочется как в пхп, просто создай слайс указателей и при итерировании val будет указывать на элемент массива

Павλо-🇺🇦 Автор вопроса
Askold
Нет, := создает новую переменную с типом данных ==...

окей, получается, при value := someArr[i] мы присваиваем копию someArr[i]?

Павλо-🇺🇦 Автор вопроса
Павλо 🇺🇦
нет, я далеко не пхпшник

я пришёл из питона, сейчас пытаюсь понять, когда происходит копирование, когда не происходит, и зачем

Павλо 🇺🇦
нет, я далеко не пхпшник

Судя по вопросам ты далеко не программист, а максимум трейни

Павλо 🇺🇦
я пришёл из питона, сейчас пытаюсь понять, когда п...

Попробуй тогда вместо того, чтобы задавать глупые вопросы и жаловаться на язык, для начала пройти: https://go.dev/tour/welcome/1

Павλо-🇺🇦 Автор вопроса
Askold
Попробуй тогда вместо того, чтобы задавать глупые ...

начнём с того, что на язык я не жаловался. Я пытаюсь разобраться, как и когда конкретно работают циклы, в т.ч. value := someArr[i]. Думаю, твоё оценочное суждение о моём уровне и просьба пройти тур по го здесь неуместно.

Павλо 🇺🇦
начнём с того, что на язык я не жаловался. Я пытаю...

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

Павλо-🇺🇦 Автор вопроса
Askold
Очень даже уместно послать тебя на го тур ибо ты б...

насколько я помню, такие нюансы в туре не освещены.

Павλо 🇺🇦
насколько я помню, такие нюансы в туре не освещены...

Да что ты говоришь, а то что почти во всех языках где указатели такая же логика?)

Павλо-🇺🇦 Автор вопроса
Askold
Да что ты говоришь, а то что почти во всех языках ...

как я уже сказал, я пришёл из питона. И временами, на практике приходится встречаться с подобными тонкостями.

Павλо 🇺🇦
как я уже сказал, я пришёл из питона. И временами,...

Для питонистов программирование это уже тонкость)

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

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

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
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
Карта сайта