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