Прекрасное видео по внутреннему устройству языка! Было бы здорово в отдельном видео раскрыть тему хранения данных на стеке и куче, если такого ещё нет на канале.
Язык Golang кажется очень простым, и кажется, что ты уже всё знаешь о нём. Но всё равно он остаётся интересным, и хочется изучать его глубже. Спасибо вам за это!
6:50 «добавляю единичку умножаю на два» звучит так будто другой порядок операций. Массив не указатель - да, внутри нет указателя, но сам массив это же по сути указатель, и на 6:50 вы как раз работаете с ним как с указателем
Про range по массивам стоит сказать, что в правой части range массив тоже будет скопирован. Т.е если range через i, v и в первой итерации меняем последний элемент массива по индексу, то на последней итерации v будет старый.
При написании своей функции Append на 1:15:15 допущена серьёзная ошибка. Не учтено, что len(data) может быть больше чем previousLen. Например: previousLen = 1; cap(slice) = 4; len(data) = 5; Получим, что newLength = 6 и newLength > cap(slice), функция make создаст newSlice( len=2; cap=2) В строке 21 получим панику. Чтобы исправить ошибку, лучше в строке 11 написать: capacity := newLength + newLength В функции main (строки 28-36) вместо своей функции Append вызывается стандартная функция append.
Привет! вот мне тут подумалось а может правильнее не передавать массив в функцию? это же будет как мы тут выяснили совсем не квантовое действие правильнее в духе GO делать передачу массива в канале верно? )
Я не понял: ты говоришь, что массив не является указателем и сразу после говоришь, что массив указывает на начало блока памяти. Объясни, пожалуйста, я запутался. Тайминг: 5:43
Добрый день, 6:19 Массив это не указатель, 6:35 Уже есть указатель на начало, не стыковка. Возможно, те кто говорил что массив есть указатель, очень хорошо понимают С анд С++, где имя массива хранит в себе адрес первого элемента и то что вы приводите на графике с 6:34 и есть разыменование указателя. Так что да имя массива и есть указатель! Дальше опасаюсь смотреть, потому что докладчик может нести неправдивую информацию.
Массив, как и любая другая переменная находится в памяти, у этого участка памяти есть адрес, относительно этого адреса я произвожу все операции (все равно, что если я бы обратился к 4 байту int32 переменной - когда int32 переменная не является указателем) Если вы настолько категоричны к тому, что я в том месте употребил слово "указатель на начало", а не "начало массива" - пожалуйста, можете дальше не смотреть
В iteration_optimization логическая ошибка в BenchmarkWithLoopUnwinding(). Счетчик увеличивается на единицу, а не на 4. Нужно либо j+=4 в заголовке цикла, либо j*4 в индексах. Это несколько ухудшит производительность, но не сильно.
эээм, а если я взял адресс массива а он потом переехал, я подозреваю а рантайме нет event-driven механизма при котором моя пременная с адресом обновится автоматически? Получается я любой момент времени я могу получить invalid pointer? Или это не так и рантайм постоянно резолвит адреса во время обращения к переменной?
согласен, семантически не совсем понятна разница между указателем и указыванием, но там дальше в видео объясняется, что указатель массива и его длинна становятся типом самого массива и хранятся эти значения в таблице
Если уж каверкать устоявшуюся английскую терминологию и пытаться передать смысл на русском, то это не срез, а нарезка тогда уж. Не нужно выдумывать термины, есть общепринятое соглашение, что ЯП и терминология с ним связанная - всё на английском языке.
Присоединяйтесь к моему каналу в Телеграм: t.me/vladimir_balun_programming
Пожалуй лучшее видео про слайсы и массивы в Go на ютубе, даже на англоязычном ютубе ничего такого не видел)
Спасибо большое!
Час назад видео вышло.. хоть посмотрел , прежде чем писать?
@@sychsiarhei6208 мне хватило 40 минут, чтобы написать комментарий
@@sychsiarhei6208 , на х2 скорости спокойно)
Лучший гайд на в ру сигменте, сделай пожалуйста по мапам то же и самое
Пожалуй поправлю Маэстро)). На 19:36 все таки при make([]int, 3, 6) будет три элемента в слайсе, т.е. [0, 0, 0]. Капасити все так же 6 элементов. 😊
Прошу прощения, далее все объяснено, но на том слайде корректнее все таки три элемента изобразить)
Прекрасное видео по внутреннему устройству языка! Было бы здорово в отдельном видео раскрыть тему хранения данных на стеке и куче, если такого ещё нет на канале.
Спасибо!
Очень даже годно и простым языком с примерами. Буду смотреть твои выпуски.
Язык Golang кажется очень простым, и кажется, что ты уже всё знаешь о нём. Но всё равно он остаётся интересным, и хочется изучать его глубже. Спасибо вам за это!
@@CsturboNetPlus он действительно простой, чтобы начать на нем писать, но как и влюбил другом языке - в нем есть множество тонкостей и нюансов
хотелось бы видеть livecoding, на примере какого нить проекта, к примеру web с использованием какого нить фраемворка fiber или gin
На 40:00 минуте прям очень интересно)
у нас есть указатель на начало массива, но при этом массив это никакой не указатель область памяти)
Дадада
Владимир, в тесте BenchmarkWithLoopUnwniding вы итерируетесь по четверти массива (зато 4 раза).
6:50 «добавляю единичку умножаю на два» звучит так будто другой порядок операций.
Массив не указатель - да, внутри нет указателя, но сам массив это же по сути указатель, и на 6:50 вы как раз работаете с ним как с указателем
Владимир, спасибо большое за раскрытие темы! Это очень круто! Ты бы мог прикрепить презентацию с видео?
Спасибо, презентацию не смогу прикрепить, так как она будет меняться периодически
Кажется я уже стал Senior Go developer)))
Давай курс по c++😅
Может быть в будущем сделаю по многопоточному программированию)
Теперь мамкины интервьюеры ещё злее будут долбить кандидатов этими слайсами. Спасибо хоть пока дженерики особо не осилили
Про range по массивам стоит сказать, что в правой части range массив тоже будет скопирован.
Т.е если range через i, v и в первой итерации меняем последний элемент массива по индексу, то на последней итерации v будет старый.
Здравствуйте! Где я могу заказать книги для, начинающих программирования на C++ ?
При написании своей функции Append на 1:15:15 допущена серьёзная ошибка.
Не учтено, что len(data) может быть больше чем previousLen.
Например: previousLen = 1; cap(slice) = 4; len(data) = 5;
Получим, что newLength = 6 и newLength > cap(slice), функция make создаст newSlice( len=2; cap=2)
В строке 21 получим панику.
Чтобы исправить ошибку, лучше в строке 11 написать:
capacity := newLength + newLength
В функции main (строки 28-36) вместо своей функции Append вызывается стандартная функция append.
Привет!
вот мне тут подумалось а может правильнее не передавать массив в функцию?
это же будет как мы тут выяснили совсем не квантовое действие
правильнее в духе GO делать передачу массива в канале
верно? )
@@彡_UCI_彡 не нужно так делать)
Я не понял: ты говоришь, что массив не является указателем и сразу после говоришь, что массив указывает на начало блока памяти. Объясни, пожалуйста, я запутался. Тайминг: 5:43
Добрый день, 6:19 Массив это не указатель, 6:35 Уже есть указатель на начало, не стыковка. Возможно, те кто говорил что массив есть указатель, очень хорошо понимают С анд С++, где имя массива хранит в себе адрес первого элемента и то что вы приводите на графике с 6:34 и есть разыменование указателя. Так что да имя массива и есть указатель! Дальше опасаюсь смотреть, потому что докладчик может нести неправдивую информацию.
Массив, как и любая другая переменная находится в памяти, у этого участка памяти есть адрес, относительно этого адреса я произвожу все операции (все равно, что если я бы обратился к 4 байту int32 переменной - когда int32 переменная не является указателем)
Если вы настолько категоричны к тому, что я в том месте употребил слово "указатель на начало", а не "начало массива" - пожалуйста, можете дальше не смотреть
На 19:40 там неверно, должно быть // [0, 0, 0]
Нет, я нулями показывал не длину, а емкость
В iteration_optimization логическая ошибка в BenchmarkWithLoopUnwinding(). Счетчик увеличивается на единицу, а не на 4. Нужно либо j+=4 в заголовке цикла, либо j*4 в индексах. Это несколько ухудшит производительность, но не сильно.
И len(data)/4 лучше выполнить 1 раз перед циклом. Но надо мерять, что быстрее j+=4 и проверка на
@@va-petrov да, на счет ошибки согласен
эээм, а если я взял адресс массива а он потом переехал, я подозреваю а рантайме нет event-driven механизма при котором моя пременная с адресом обновится автоматически? Получается я любой момент времени я могу получить invalid pointer? Или это не так и рантайм постоянно резолвит адреса во время обращения к переменной?
Если массив [0]int{} имеет размер 0 байт, верно ли, что эту конструкцию можно использовать как замену пустой структуре при передаче через каналы?
@@dlatin зачем?)
@@vladimir_balun_programmingвопрос не в этом, а в том - будет ли это полноценной альтернативой?
4:38 если массивы можно сравнивать, почему их нельзя использовать как ключи в мапе?
а, перепутал со слайсами
@@dmitryzhigalkin1276 go.dev/play/p/Sb6nLu-rsS7 - можно
это нельзя не лайкнуть
"массив не указатель". через минуту "берем указатель на масив и через ансейв читаем данные" :)
А где здесь противоречие? Указатель != взять указатель на что-то
согласен, семантически не совсем понятна разница между указателем и указыванием, но там дальше в видео объясняется, что указатель массива и его длинна становятся типом самого массива и хранятся эти значения в таблице
@@НеферумСанайель еще раз скажу - указатель != взять указатель на то, что не является указателем
Если уж каверкать устоявшуюся английскую терминологию и пытаться передать смысл на русском, то это не срез, а нарезка тогда уж. Не нужно выдумывать термины, есть общепринятое соглашение, что ЯП и терминология с ним связанная - всё на английском языке.