Присоединяйтесь к моему каналу в Telegram: t.me/vladimir_balun_programming Делюсь там интересными активностями, мыслями, новостями и материалами по программированию, а также рассказываю о том, что читаю и изучаю по программированию и не только!
Прекрасное видео по внутреннему устройству языка! Было бы здорово в отдельном видео раскрыть тему хранения данных на стеке и куче, если такого ещё нет на канале.
6:50 «добавляю единичку умножаю на два» звучит так будто другой порядок операций. Массив не указатель - да, внутри нет указателя, но сам массив это же по сути указатель, и на 6:50 вы как раз работаете с ним как с указателем
Язык Golang кажется очень простым, и кажется, что ты уже всё знаешь о нём. Но всё равно он остаётся интересным, и хочется изучать его глубже. Спасибо вам за это!
На 30:02 вы делаете глобальную переменную Result и в этом случае бенчмарк тест для нашей конвертации показывает лучшее время, но если переменную описать вот так 1)result := []byte(str) 2)result := convert(str), то в первом случае будет лучшее время. Мне вот интересно почему?
Про 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.
Я не понял: ты говоришь, что массив не является указателем и сразу после говоришь, что массив указывает на начало блока памяти. Объясни, пожалуйста, я запутался. Тайминг: 5:43
эээм, а если я взял адресс массива а он потом переехал, я подозреваю а рантайме нет event-driven механизма при котором моя пременная с адресом обновится автоматически? Получается я любой момент времени я могу получить invalid pointer? Или это не так и рантайм постоянно резолвит адреса во время обращения к переменной?
В iteration_optimization логическая ошибка в BenchmarkWithLoopUnwinding(). Счетчик увеличивается на единицу, а не на 4. Нужно либо j+=4 в заголовке цикла, либо j*4 в индексах. Это несколько ухудшит производительность, но не сильно.
Добрый день, 6:19 Массив это не указатель, 6:35 Уже есть указатель на начало, не стыковка. Возможно, те кто говорил что массив есть указатель, очень хорошо понимают С анд С++, где имя массива хранит в себе адрес первого элемента и то что вы приводите на графике с 6:34 и есть разыменование указателя. Так что да имя массива и есть указатель! Дальше опасаюсь смотреть, потому что докладчик может нести неправдивую информацию.
Массив, как и любая другая переменная находится в памяти, у этого участка памяти есть адрес, относительно этого адреса я произвожу все операции (все равно, что если я бы обратился к 4 байту int32 переменной - когда int32 переменная не является указателем) Если вы настолько категоричны к тому, что я в том месте употребил слово "указатель на начало", а не "начало массива" - пожалуйста, можете дальше не смотреть
Привет! вот мне тут подумалось а может правильнее не передавать массив в функцию? это же будет как мы тут выяснили совсем не квантовое действие правильнее в духе GO делать передачу массива в канале верно? )
Если уж каверкать устоявшуюся английскую терминологию и пытаться передать смысл на русском, то это не срез, а нарезка тогда уж. Не нужно выдумывать термины, есть общепринятое соглашение, что ЯП и терминология с ним связанная - всё на английском языке.
согласен, семантически не совсем понятна разница между указателем и указыванием, но там дальше в видео объясняется, что указатель массива и его длинна становятся типом самого массива и хранятся эти значения в таблице
Присоединяйтесь к моему каналу в Telegram: t.me/vladimir_balun_programming
Делюсь там интересными активностями, мыслями, новостями и материалами по программированию, а также рассказываю о том, что читаю и изучаю по программированию и не только!
Пожалуй лучшее видео про слайсы и массивы в Go на ютубе, даже на англоязычном ютубе ничего такого не видел)
Спасибо большое!
Час назад видео вышло.. хоть посмотрел , прежде чем писать?
@@sychsiarhei6208 мне хватило 40 минут, чтобы написать комментарий
@@sychsiarhei6208 , на х2 скорости спокойно)
Владимир, вас очень приятно слушать, разбор темы глубокий, чувствуется интерес и профессионализм, однозначно лайк
очень круто, спасибо!
Теперь мамкины интервьюеры ещё злее будут долбить кандидатов этими слайсами. Спасибо хоть пока дженерики особо не осилили
Прекрасное видео по внутреннему устройству языка! Было бы здорово в отдельном видео раскрыть тему хранения данных на стеке и куче, если такого ещё нет на канале.
Спасибо!
57:02 сижу такой слушаю и тут: "меньше или больше 10мбайт" и я такой, чего, мой разум был хакнут
На 46:10 классно было бы напомнить людям о том что у каждой переменной есть тип и значение и len cap лезут в именно в тип
Пожалуй поправлю Маэстро)). На 19:36 все таки при make([]int, 3, 6) будет три элемента в слайсе, т.е. [0, 0, 0]. Капасити все так же 6 элементов. 😊
Прошу прощения, далее все объяснено, но на том слайде корректнее все таки три элемента изобразить)
Очень даже годно и простым языком с примерами. Буду смотреть твои выпуски.
34:30 в loopunwinding функции ошибка в цикле вместо len/4 и j++ надо j += 4 иначе не пройдем весь слайс. Скорее даже опечатка))
А видео отличное
6:50 «добавляю единичку умножаю на два» звучит так будто другой порядок операций.
Массив не указатель - да, внутри нет указателя, но сам массив это же по сути указатель, и на 6:50 вы как раз работаете с ним как с указателем
Лучший гайд на в ру сигменте, сделай пожалуйста по мапам то же и самое
Язык Golang кажется очень простым, и кажется, что ты уже всё знаешь о нём. Но всё равно он остаётся интересным, и хочется изучать его глубже. Спасибо вам за это!
@@KranWagen он действительно простой, чтобы начать на нем писать, но как и влюбил другом языке - в нем есть множество тонкостей и нюансов
На 30:02 вы делаете глобальную переменную Result и в этом случае бенчмарк тест для нашей конвертации показывает лучшее время, но если переменную описать вот так 1)result := []byte(str) 2)result := convert(str), то в первом случае будет лучшее время. Мне вот интересно почему?
Владимир, спасибо большое за раскрытие темы! Это очень круто! Ты бы мог прикрепить презентацию с видео?
Спасибо, презентацию не смогу прикрепить, так как она будет меняться периодически
у нас есть указатель на начало массива, но при этом массив это никакой не указатель область памяти)
Дадада
хотелось бы видеть livecoding, на примере какого нить проекта, к примеру web с использованием какого нить фраемворка fiber или gin
27:50 а если в строке символы более 1Б и они в перемешку с 1Б символами, то не смогу воспользоваться, как я понял
Про 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.
Я не понял: ты говоришь, что массив не является указателем и сразу после говоришь, что массив указывает на начало блока памяти. Объясни, пожалуйста, я запутался. Тайминг: 5:43
Давай курс по c++😅
Может быть в будущем сделаю по многопоточному программированию)
На 40:00 минуте прям очень интересно)
Кажется я уже стал Senior Go developer)))
эээм, а если я взял адресс массива а он потом переехал, я подозреваю а рантайме нет event-driven механизма при котором моя пременная с адресом обновится автоматически? Получается я любой момент времени я могу получить invalid pointer? Или это не так и рантайм постоянно резолвит адреса во время обращения к переменной?
Владимир, в тесте BenchmarkWithLoopUnwniding вы итерируетесь по четверти массива (зато 4 раза).
вроде да, там нужно было приращение j++ поменять на j += 4
Здравствуйте! Где я могу заказать книги для, начинающих программирования на C++ ?
В iteration_optimization логическая ошибка в BenchmarkWithLoopUnwinding(). Счетчик увеличивается на единицу, а не на 4. Нужно либо j+=4 в заголовке цикла, либо j*4 в индексах. Это несколько ухудшит производительность, но не сильно.
И len(data)/4 лучше выполнить 1 раз перед циклом. Но надо мерять, что быстрее j+=4 и проверка на
@@va-petrov да, на счет ошибки согласен
Добрый день, 6:19 Массив это не указатель, 6:35 Уже есть указатель на начало, не стыковка. Возможно, те кто говорил что массив есть указатель, очень хорошо понимают С анд С++, где имя массива хранит в себе адрес первого элемента и то что вы приводите на графике с 6:34 и есть разыменование указателя. Так что да имя массива и есть указатель! Дальше опасаюсь смотреть, потому что докладчик может нести неправдивую информацию.
Массив, как и любая другая переменная находится в памяти, у этого участка памяти есть адрес, относительно этого адреса я произвожу все операции (все равно, что если я бы обратился к 4 байту int32 переменной - когда int32 переменная не является указателем)
Если вы настолько категоричны к тому, что я в том месте употребил слово "указатель на начало", а не "начало массива" - пожалуйста, можете дальше не смотреть
Если массив [0]int{} имеет размер 0 байт, верно ли, что эту конструкцию можно использовать как замену пустой структуре при передаче через каналы?
@@dlatin зачем?)
@@vladimir_balun_programmingвопрос не в этом, а в том - будет ли это полноценной альтернативой?
4:38 если массивы можно сравнивать, почему их нельзя использовать как ключи в мапе?
а, перепутал со слайсами
@@dmitryzhigalkin1276 go.dev/play/p/Sb6nLu-rsS7 - можно
На 19:40 там неверно, должно быть // [0, 0, 0]
Нет, я нулями показывал не длину, а емкость
Привет!
вот мне тут подумалось а может правильнее не передавать массив в функцию?
это же будет как мы тут выяснили совсем не квантовое действие
правильнее в духе GO делать передачу массива в канале
верно? )
@@彡_UCI_彡 не нужно так делать)
Если уж каверкать устоявшуюся английскую терминологию и пытаться передать смысл на русском, то это не срез, а нарезка тогда уж. Не нужно выдумывать термины, есть общепринятое соглашение, что ЯП и терминология с ним связанная - всё на английском языке.
"массив не указатель". через минуту "берем указатель на масив и через ансейв читаем данные" :)
А где здесь противоречие? Указатель != взять указатель на что-то
согласен, семантически не совсем понятна разница между указателем и указыванием, но там дальше в видео объясняется, что указатель массива и его длинна становятся типом самого массива и хранятся эти значения в таблице
@@НеферумСанайель еще раз скажу - указатель != взять указатель на то, что не является указателем
это нельзя не лайкнуть