&someArr[i] != &val
}
подскажите, почему так? Почему при итерировании по массиву через for … range, val копируется?
Чтобы ты неявно случайно не поменял значение в слайсе?
то есть, это специально введённое ограничение от дурака? Или за этим скрывается конкретный технический бэкграунд, который привёл к этому поведению по иным причинам?
А что ещё можно ожидать, указатель?
я ожидал, что val будет исконным элементом массива. Тобишь, я ожидал, что &val == &someArr[i]
А с чего у вас такие ожидания, в каком языке при цикле неявно берутся указатели на элементы массива?
потому что я считал range сахаром над обычным сишным циклом, превращающий что-то вроде for index, value := range something в нечто for index := 0; index < len(something); index++ { value := something[index] ... }
вопрос остается открытым: https://goplay.space/#iZILFdLsTjb вы своим же примером подтвердили нелогичность ваших ожиданий
ну и окончательно, в си https://onlinegdb.com/-TiTAdgecI ваше "ожидение" тоже не работает)
Эт врооде на википедии даже описано - В цикле по коллекции переменная-значение является копией, а не ссылкой. В цикле вида «for index, value := range collection» переменная value является копией текущего элемента. Операция присваивания этой переменной нового значения доступна, но, вопреки ожиданиям, не приводит к изменению текущего элемента коллекции.
В языках где всё передаётся по ссылке создаётся такое ощущение. В том же php например.
В php по ссылке передаются только экземпляры классов)
не только, массивы тоже, пока вы не начнете их менять (copy on write)
Ну вот в пхп и можно (не в си) использовать вот такую запись: foreach($arr as &$item). Я писал об этом
хм. А почему так? Мы ведь присваиваем переменной value значение конкретного элемента массива
спасибо. Плохо, что мне пришлось эмпирическим путём к этому дойти
Нет, := создает новую переменную с типом данных == типу элемента слайса (причем под капотом она создается 1 раз, и потом переиспользуется)
то есть, := копирует оригинальный объект, и при всех остальных идентичных присваиваниях присваивает одну и ту же копию?
Нет, ты бред несешь
Короче говоря, ты скорее всего как пхпшник должен понимать, что по умолчанию в пхп неявно хранятся указатели на объекты (на другие типы данные по умолчанию хранятся значения). В го если тебе очень хочется как в пхп, просто создай слайс указателей и при итерировании val будет указывать на элемент массива
окей, получается, при value := someArr[i] мы присваиваем копию someArr[i]?
нет, я далеко не пхпшник
я пришёл из питона, сейчас пытаюсь понять, когда происходит копирование, когда не происходит, и зачем
Судя по вопросам ты далеко не программист, а максимум трейни
ну, не мне судить
Попробуй тогда вместо того, чтобы задавать глупые вопросы и жаловаться на язык, для начала пройти: https://go.dev/tour/welcome/1
начнём с того, что на язык я не жаловался. Я пытаюсь разобраться, как и когда конкретно работают циклы, в т.ч. value := someArr[i]. Думаю, твоё оценочное суждение о моём уровне и просьба пройти тур по го здесь неуместно.
Очень даже уместно послать тебя на го тур ибо ты будешь шокирован, когда возьмешь указатель на итерируемый элемент и передашь его в горутину))))
насколько я помню, такие нюансы в туре не освещены.
Да что ты говоришь, а то что почти во всех языках где указатели такая же логика?)
как я уже сказал, я пришёл из питона. И временами, на практике приходится встречаться с подобными тонкостями.
Для питонистов программирование это уже тонкость)
хорошо, держи в курсе
Обсуждают сегодня