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

For i, val := range someArr {

&someArr[i] != &val
}

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

32 ответов

12 просмотров

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

Павло-Побуджувач Автор вопроса
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
Да что ты говоришь, а то что почти во всех языках ...

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

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

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

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

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

А еще в перле можно уже @arr1 + @arr2?
Sergei Zhmylove
53
Подскажите, где смотреть результат выполнения программы? Код: ;.686 ;Система команд процессора 686 ;.MODEL FLAT,stdcall ;Модель памяти плоская, станда...
Егор Анелькин
5
я не магистр хаскеля, но разве не может лейзи тип конвертнуться в не-лейзи запросив вычисление содержимого прям при инициализации?
deadgnom32 λ madao
100
Привет всем. появился вопрос. Разрабатываю сайт, в данный момент он запущен. Хостинг beget. Добавляю на сайт яндекс метрику с помощью полей client-settings (взято отсюда http...
Andrew
2
;.686 ;Система команд процессора 686 ;.MODEL FLAT,stdcall ;Модель памяти плоская, стандартный ;вызов процедуры ;option casemap:no...
Егор Анелькин
1
почому оно не работает?
Vi Chapmann Chapmann
19
Так а кто может спарсить всех участников чата? Идишники
Magic
17
Есть вопрос: допустим есть железка с каким-то интерфейсом(допустим usb), но как по этому интерфейсу железкой управлять неизвестно, прог нету, а управлять очень хочется надо. К...
Mixail Frolov
15
а как ловят такое ghci> res <- getPos2 urlt 0 (alist !! 0) 200 ghci> res SearchAtom (Search "www.google.com" "/search?q=" "Haskell") "haskell.org" (SearchTS [(2024-05-06 07:...
Fedor
14
всем привет почти закончил курс После него можно писать свою операционку? Какие библиотеки надо использовать и куда дальше копать для изучения
Linus
13
Карта сайта