Тёмный

Задача из Ozon: Golang собеседование 

Oleg Kozyrev - life in IT
Подписаться 3,4 тыс.
Просмотров 20 тыс.
50% 1

Мой курс по разработке микросервисов: clck.ru/389FPG
Мой Boosty: boosty.to/olezhek28
Linkedin: / olezhek28
Telegram-канал: t.me/olezhek28go
В этом ролике мы разберем популярную задачу с golang собеседований. Golang нынче стал хайповым языком программирования и многие люди переходят на него с других языков. Поэтому и важно научится решать эту golang задачку, чтобы не ударить в грязь лицом на собесе для golang разработчика. Можно сказать - этот ролик небольшой урок по golang, потому что для понимания некоторых аспектов этой задачи нам нужно заглянуть в go поглубже. На практике golang порой бывает неочевидным и важно понимать, что за этим стоит. И ещё, в конце ролика я накинул пару вопросов на подумать для вас. Смотрите до конца и пишите свои ответы в комментах.

Опубликовано:

 

16 окт 2023

Поделиться:

Ссылка:

Скачать:

Готовим ссылку...

Добавить в:

Мой плейлист
Посмотреть позже
Комментарии : 129   
@Erdaulet100
@Erdaulet100 4 месяца назад
Олег вырост, когда-то смотрел собеседование на middle разработка, а уже ведущий разраб и сам уже контент пилит)
@olezhek28go
@olezhek28go 4 месяца назад
Как говорится: «все течет, все изменяется»
@Halatam610
@Halatam610 3 месяца назад
Ждём курсы )))
@ampership
@ampership 5 месяцев назад
Очень понравился стиль изложения, и задачка интересная. Хотелось бы видеть еще подобные видео с Гошными премудростями )
@olezhek28go
@olezhek28go 5 месяцев назад
Спасибо:))) думаю еще будет
@rasulikv
@rasulikv 7 месяцев назад
очень понравился стиль изложения, поэтому было бы круто увидеть больше видеo про подобные тонкости🙂
@olezhek28go
@olezhek28go 7 месяцев назад
Спасибо:) буду стараться делать новые видео
@egesihora4761
@egesihora4761 6 месяцев назад
Олег объясняет как боженька. Так чётко и просто всё разложил, спасибо!
@olezhek28go
@olezhek28go 6 месяцев назад
Спасибо, рад что понравилось:)
@madbad1310
@madbad1310 7 месяцев назад
Очень понравилось, спасибо
@olezhek28go
@olezhek28go 7 месяцев назад
Здорово!:)
@spruslaks26
@spruslaks26 3 месяца назад
Thanks for detailed explanation
@olezhek28go
@olezhek28go 3 месяца назад
Did you read subs?) Is it helpful?
@spruslaks26
@spruslaks26 3 месяца назад
I understand Russian, I just have difficulties with writing, so I did not use subs. @@olezhek28go
@olezhek28go
@olezhek28go 3 месяца назад
Interesting:) Where are you from?)
@ghvddacvasfxghefc3988
@ghvddacvasfxghefc3988 7 месяцев назад
for range возвращает index, value. Если запрашиваем одну переменную, то индекс. Поэтому 0,1,2,3,4
@olezhek28go
@olezhek28go 7 месяцев назад
верно)))
@aleksanderpeshkin2266
@aleksanderpeshkin2266 26 дней назад
Покажи конечный продукт где такое применяется с горктинами и каналами !! А то весь Ютуб показывает код , а где это работает и какую пользу несёт не ясно . Чтобы понимать зачем вообще такое спрашивают
@user-zh1wz1rh6x
@user-zh1wz1rh6x 7 месяцев назад
Очень классный формат, хочется больше таких примеров) Прикольно что сначала можно было попробовать самому решить задачу, а потом увидеть где не прав)
@olezhek28go
@olezhek28go 7 месяцев назад
Спасибо) думаю буду периодически делать такие ролики
@SHALfEY088
@SHALfEY088 6 месяцев назад
Требуем больше познавательных роликов!
@olezhek28go
@olezhek28go 6 месяцев назад
Если получится, то в эти выходные буду снимать :)
@user-fs3co7hy2t
@user-fs3co7hy2t 7 месяцев назад
респект за инфу, про то что в замыкания по прокидываются переменные, не знал, прокидывал всегда все через аргументы функции
@olezhek28go
@olezhek28go 7 месяцев назад
Круто, что узнал что-то новое:))
@rmwk991
@rmwk991 6 месяцев назад
Спасибо, и формат супер и было полезно. Пожалуйста, не останавливайся!) Меня на собесе ещё спрашивали как оставляя горутины сделать, чтобы числа выводились последовательно и желательно было набросать и объяснить пару вариантов
@olezhek28go
@olezhek28go 6 месяцев назад
Спасибо:) и какие варики в голову пришли?
@rmwk991
@rmwk991 6 месяцев назад
​@@olezhek28go через каналы или wg.Wait() поставить в конец цикла
@Argon-X
@Argon-X 4 месяца назад
​@@olezhek28go мне кажется тут можно канал использовать и читать из него числа
@user-nt5zn4rg4l
@user-nt5zn4rg4l 4 месяца назад
Формат отличный. Покачали задачу. Так намного интереснее
@olezhek28go
@olezhek28go 4 месяца назад
Спасибо, рад что зашло:)
@nickkim9479
@nickkim9479 Месяц назад
Олег, можно консультацию получить у тебя, по дису например, если да то где контакт спросить?
@olezhek28go
@olezhek28go Месяц назад
В телеге olezhek28
@artemkashipov9865
@artemkashipov9865 2 месяца назад
по поводу первого вопроса все будет работать абсолютно также как и на нескольких ядрах, никакой разницы нет с точки зрения планировщика. 4 выводится первой потому что у нее по сути кеш прогрет больше всего. там вроде как есть стек размером в один как раз для этого, чтобы брать оттуда задачи первыми. Правильно?)
@olezhek28go
@olezhek28go 2 месяца назад
Ага, все так)
@Mak_Sim0
@Mak_Sim0 Месяц назад
Привет. Мне предлодили оффер в озон. Можешь рассказать чтото про перфоманс ревью и индексацию зп? Думаю отказаться только изза этого. Начитался отзывов на дримджоб
@olezhek28go
@olezhek28go Месяц назад
Напиши мне в личку в тг - olezhek28
@soundcloudlover
@soundcloudlover 7 месяцев назад
будут ли ролики по внутрянкам го? типа работа gc, аллокаторы памяти, планировщик горутин и тд
@olezhek28go
@olezhek28go 7 месяцев назад
Все может быть, но пока точно ответить не могу)
@victorklimov5254
@victorklimov5254 7 месяцев назад
Такое поведение (4, 0, 1, 2, 3) повторяется. У меня предположение, что горутины с 0 по 3 ставятся в локальную очередь. А горутина с 4-кой ставится в LIFO часть глобальной очереди и оттуда и исполняется первой (потому что она уже есть в кэше процессора), а уже за ней те, что локальной очереди.
@olezhek28go
@olezhek28go 7 месяцев назад
Полагаю так и есть:) кстати, случаем нет статейки про это под рукой? а то я этот дивный факт знаю, но вот пытался статейку найти, чтоб кидать людям и обычно просто про очередь упрощенно пишут
@victorklimov5254
@victorklimov5254 7 месяцев назад
@@olezhek28go постарался поискать где я эту информацию взял, но не нашел сходу
@waffleboot
@waffleboot 7 месяцев назад
Размер локальной очереди 256. А так гуглить runnext, это поле у P. Новые горутины получают приоритет, при этом используют остаток временного слота горутины-создателя. Каждый go stmt забрасывает новую горутину в runnext и шедулер возьмет сначала горутину из runnext и только потом начнет разгребать локальную очередь.
@johnsc4521
@johnsc4521 7 месяцев назад
На русском я не находил ни одной толковой статьи. Есть на английском. Можно почитать с браузерным переводчиком. Только тутуб комментарии с ссылками не пропускает.
@olezhek28go
@olezhek28go 7 месяцев назад
@johnsc4521 странно, что ссылки не пропускает, вроде должен
@victorkochkarev2576
@victorkochkarev2576 7 месяцев назад
Спасибо за рассказ о фигче loopvar.
@olezhek28go
@olezhek28go 7 месяцев назад
Наконец то нашел повод попробовать:)
@victorkochkarev2576
@victorkochkarev2576 7 месяцев назад
@@olezhek28go Штука интересная, но она вызывает у меня настороженность. Уже представляю ситуации, когда девелопер пишет код и этой активированной функцией, а в билд пайплайне это причуда не активирована - и код уходит в продакшн.
@olezhek28go
@olezhek28go 7 месяцев назад
С февраля это будет по дефолту в языке
@saimonshaplygin7867
@saimonshaplygin7867 6 месяцев назад
интересно, автор видео согласовывал нейминг видео? не будет ли каких-либо юридических проблем, так как Олег ранее работал в Озон?
@olezhek28go
@olezhek28go 6 месяцев назад
Это ж больше внимание привлечь, задачу то эту где угодно спросить могу , ибо уж очень популярная)
@Ra1nist
@Ra1nist 6 месяцев назад
Когда примерно будет старт курса по разработке микросервисов?
@olezhek28go
@olezhek28go 6 месяцев назад
Второй поток сейчас заканчивается, а новый будет уже после НГ думаю
@kamex3102
@kamex3102 5 месяцев назад
Спасибо, позновательно! 17:40 Можно предположить что планировкщик задач GO в любом случае использует какой то алгоритм для выбора порядка выполненния задач в отведенное ему процессорное время. И он не просто выполняет их по порядку, а например пытается "усреднить" нагрузку дергая из разных частей списка задач. 15:59 Если правильно понимаю первая переменная при исользовании range - индекс записи. ( индек, значение := range слайс) А вот почему такой вывод в 22 версии непонимаю. При планировании горутины делается снимок используемых переменных? Если выводить адрес переменной в 21 и 22 версии, наблюдается разное поведение. В 21 он в каждой горутине одинаковый. В 22 - каждый раз новый адрес. Причем как если передавать его как аргумент и если через замыкание. Не наткнулся в патч ноуте с ходу на это. Есть какой то док описывающий поведение?
@Alexey-gp7vc
@Alexey-gp7vc 5 месяцев назад
Загугли "Fixing For Loops in Go 1.22", ещё там внизу статьи есть раздел More Information с ссылками на дизайн-док и фак. А если вкратце и на пальцах - раньше переменная цикла имела областью видимости весь цикл, а теперь областью видимости будет только итерация цикла.
@mrApelsin4ikGaming
@mrApelsin4ikGaming 2 дня назад
не, там прикол том, что в шедулере у каждой М есть очередь фифо и одноэлементный лифо, мы в него кладем последний элемент, но и брать будем сначала из него
@wqwwsqwsqess4165
@wqwwsqwsqess4165 5 месяцев назад
1)горутины не параллельны, а конкуренты, то бишь рантайм под коробкой решает как переключаться между ними, пока одна горутина спит другая работает 2)мы берём индексы слайса, п не сами значения, поэтому такое и поведение
@olezhek28go
@olezhek28go 5 месяцев назад
1) ну врядли на одном принте будет какое-то переключение между горутинами
@user-by6lf1js6w
@user-by6lf1js6w 5 месяцев назад
Чтоб в выводе было 1-5, надо так: for _, i := range
@olezhek28go
@olezhek28go 5 месяцев назад
Верно!:)
@user-by6lf1js6w
@user-by6lf1js6w 5 месяцев назад
@@olezhek28go Спасибо за задачки!:) Кстати, я решил оставить в Print() вывод адреса WaitGroup. Результат меня удивил 0_o Адреса либо были разными все, либо частично были совпадения, либо все одинаковые. Вопрос: Потому ли это, что WaitGroup на стек попадает?:)
@Erdaulet100
@Erdaulet100 4 месяца назад
Что-то не совсем понял, то есть вывод ключей или индексов слайса, дает последовательность?
@user-by6lf1js6w
@user-by6lf1js6w 4 месяца назад
@@Erdaulet100 Привет) У слайса нет ключей (ключи есть у map). Слайс - это абстракция над массивом. У массивов и слайсов есть элементы, а у элементов есть индексы. В Go существует 2 способа пройтись по слайсу: 1) использовать обычный цикл for: for i := 0; i < len(things); i++ { things[i] = } 2) использовать цикл for range (что работает как с последовательностью в Python, но в Go это всегда либо слайс, либо массив): for i, v := range things { // i - это копия индекса текущей итерации 0...len(things)-1 // v - это копия значения элемента things по индексу i (как будто v = things[i]) } Записывать в копии i и v нет смысла в цикле for range. Они используются для чтения из них. Если нужно записать в элемент слайса в этом цикле, то, как обычно, используется запись things[i] =
@sverdloff
@sverdloff 5 месяцев назад
Всё, теперь в озоне разрешили defer ?))
@olezhek28go
@olezhek28go 5 месяцев назад
А запрещали?
@yarbersheer8559
@yarbersheer8559 7 месяцев назад
при log.Fatal defer не вызовется, поэтому пишет log.Panic )
@olezhek28go
@olezhek28go 7 месяцев назад
Как варик)
@96kw3
@96kw3 7 месяцев назад
нет тайной ложи, есть явная лажа, если задаваться вопросом назовите где может быть использован этот алгоритм на практике или в жизни, как часто этот алгоритм пользуется в проектах? а на собеседованиях обычно спрашивают то что сами в компаниях не пользуются и тогда появляется мысль может это не имеет значение от слова совсем
@olezhek28go
@olezhek28go 7 месяцев назад
А вы это мнение со стороны высказываете или сами на гошке пишете?) на мой взгляд почти все аспекты языка, которые вскрывает эта задача, регулярно встречаются на практике.
@96kw3
@96kw3 7 месяцев назад
@@olezhek28go побольше практических примеров для каких целей и я Вас благодарю и целую монитор с вашим кодом
@user-ny3sl8lo8f
@user-ny3sl8lo8f 25 дней назад
Всё элементарно просто, 4 ядерный процессор. Поэтому и получается такая последовательность. Четвёртое ядро 1, 2,3,4
@user-ny3sl8lo8f
@user-ny3sl8lo8f 25 дней назад
Специально не смотрю комментарии. Верный ответ?
@olezhek28go
@olezhek28go 25 дней назад
А это на какой вопрос?) про ситуацию с го макс проц?
@Alexey-gp7vc
@Alexey-gp7vc 5 месяцев назад
Стиль изложения - огонь! На Go не пишу, но почти ни с чем не ошибся. Могу только предположить, сколько тысяч человеко-лет гоферы потратили на дебаг таких ошибок)) Впрочем, этот наш простой пайтон - тоже нифига не простой)
@olezhek28go
@olezhek28go 5 месяцев назад
Спасибо:))) на самом деле многие ошибки подобные в бест практисах учтены и некоторые люди не косячат в них и даже не понимают почему ахаха
@JIexaPol
@JIexaPol 7 месяцев назад
Это задача для миддла или джуна?
@olezhek28go
@olezhek28go 7 месяцев назад
Да такое и на сеньора спросить могут, просто ответ разной глубины устроит и конечно эта задача будет не единственной:)
@nikitajolobov4591
@nikitajolobov4591 5 месяцев назад
На сколько известно в GO рутины легковесные (2к) и одном ядре может быть несколько рутин, поэтому параллелизм сохраняется даже с одним ядром, поэтому и вывод такой
@olezhek28go
@olezhek28go 5 месяцев назад
Все так, но горутины то в очередь последовательно кладутся)
@kidayano
@kidayano 4 месяца назад
параллелизм невозможен на одном ядре))) ядро физически не может выполнять больше одной операции за один тик процессора
@olezhek28go
@olezhek28go 4 месяца назад
@@kidayano всё так, если мы гипертрединг не берем в расчёт)
@user-pg8ry1tm3t
@user-pg8ry1tm3t 7 месяцев назад
Тот случай, когда основной синтаксис языка видишь быстрей, чем читаешь в учебнике🥴
@olezhek28go
@olezhek28go 7 месяцев назад
Это хорошо?:)
@retvain
@retvain 7 месяцев назад
пока смотрел видео, постоянно переключался на телеграмм свой думал что мне пришло сообщение и никак не мог понять, wtf, потом как дошло)
@olezhek28go
@olezhek28go 7 месяцев назад
Там реально слышно?) я че-то при монтаже не заметил(
@yarbersheer8559
@yarbersheer8559 7 месяцев назад
загадки для джунов ))) кто ж так range пишет)) вопрос в догонку к GOMAXPROC(1). А какой порядок будет если мы перед wg.Wait() time.Sleep(1) добавим?) А если потом перед time.Sleep(1) добавим runtime.Gosched() ?)
@olezhek28go
@olezhek28go 7 месяцев назад
Исходя из моих прикидок, кажется что такой же, но может что-то упускаю) хотя… Слип это системный вызов, стало быть впору переключить контекст, дальше идет выполнение горутин в том же порядке и даже если секунды не хватит, то маин горотина же по идее залетит в глобальную очередь и оттуда наврядли раньше успеет вычитаться чем остальные, 1 к 61 как никак) но это так мысли в слух) надо завтра поиграть
@yarbersheer8559
@yarbersheer8559 7 месяцев назад
@@olezhek28go а вот тут и есть прикол ) Если делать слип без Gosched, то вывод будет 0 1 2 3 4, а если хоть раз до этого сделать Goshed, то уже 4 01 2 3 ) Если просто порассуждать т.к. истинная причина не ясна, то получается при Sleep последний стек будет не не наших горутин, а слипа, поэтому исполнение горутин будет FIFO, а Gosched в свою очередь переключит на последнюю вызванную горутину т.е. будет 4 0 1 2 3 )
@waffleboot
@waffleboot 7 месяцев назад
Получается 0,1,... Наверное потому что schedule прежде чем жертву выбрать проверяет таймеры. Видимо sleep(1) проходит слишком быстро и schedule опять выбирает main горутину в checkTimers. Можно увеличивать время сна и в какой-то момент 4 из runnext запуститься, но если таймер успеет сработать, то main горутина через checkTimers может влезть вперед local queue, в любом месте. Если Gosched добавить, то текущая горутина уйдет в конец local queue, а scheduler возьмет 4 из runnext. В данном примере с глобальной очередью вообще ничего не должно происходить, ведь capacity локальной очереди 256 + timers heap у каждого P свой. P.S. Sleep(1) это не 1 секунда, а 1 наносекунда. Duration в наносекундах. Там где duration не стоит указывать просто int, об этом 75 глава 100 Go Mistakes
@olezhek28go
@olezhek28go 7 месяцев назад
Я видать вечером не заметил, что там секунда не стояла) забавно то, что с секундой все ведет себя также) я из этой предпосылки исходил
@yarbersheer8559
@yarbersheer8559 7 месяцев назад
@@olezhek28go оу... слип 1*time.Second это перебор для смены контекста) просто time.Sleep(1) ) вот такая у нас уличная магия... в рот мне ноги.
@N-zk7vw
@N-zk7vw 5 месяцев назад
Задача топ! Да, простая. Да, боянистая. Но даже на таких задачах можно завалиться.
@olezhek28go
@olezhek28go 5 месяцев назад
Ага, иногда люди на ней такую базу выдают)
@AkramAzizmurodov
@AkramAzizmurodov 7 месяцев назад
Я ещё не понял loopvar. Что это?
@olezhek28go
@olezhek28go 7 месяцев назад
это просто значение переменной окружения, которая позволяет врубить экспериментальный функционал языка) с февраля это будет в дефолтной версии языка
@metua
@metua 2 месяца назад
а откуда взялся 0?
@olezhek28go
@olezhek28go Месяц назад
С нуля же цикл)
@metua
@metua Месяц назад
@@olezhek28goа точно, я подумал i это значения массива
@TheDavBag
@TheDavBag 7 месяцев назад
азазза голову ломал, откуда 0 и нет 5 угар, всем бобер кувра!
@olezhek28go
@olezhek28go 7 месяцев назад
Ахаха
@user-rp5ej1ui4g
@user-rp5ej1ui4g 7 месяцев назад
дейстивительно боянистая задача. на первом же собесе по го ее спросили)
@olezhek28go
@olezhek28go 7 месяцев назад
Ага) тем и удивительнее, что еще не все научились ее решать
@alexgorodecky1661
@alexgorodecky1661 6 месяцев назад
Последняя загадка настолько меня впечатлила, что я понял что не писать на голанге выбор правильный 🤨 даже JavaScript привели в чувство, по сравнению с этим вашим Го
@olezhek28go
@olezhek28go 6 месяцев назад
Да на самом то деле это больше интересный момент, чем что-то важное на практике
@boriskorotaev2038
@boriskorotaev2038 3 месяца назад
хех, а я думал алгосики спросят на го, а нет - собес как старые джава собесы, где квиз на квизе
@olezhek28go
@olezhek28go 3 месяца назад
Ахаха алгосики в другой секции)
@luckytima2315
@luckytima2315 7 месяцев назад
Братик это хайлвл, это только учу гошку мне трудно понять что происходит =/
@olezhek28go
@olezhek28go 7 месяцев назад
Придет время и все поймешь;)
@luckytima2315
@luckytima2315 7 месяцев назад
@@olezhek28go да это вообще фэйл =/ я знал питон, пришел в универ там были ++ и java, я пострадал может недели 2 и все ок стало. Java даже понравилась, начала ковырять Go, начитался комментариев “go самый простой язык ко ко” но пока мне он больше боли доставляет =/
@it1860
@it1860 7 месяцев назад
1
@olezhek28go
@olezhek28go 7 месяцев назад
поздравляю)
@vp_arth
@vp_arth 2 месяца назад
Устарело) Теперь итератор per-iteration, а не per-loop upd: а, блин, досмотрел) А загадка про конкурентность vs параллельность.
@olezhek28go
@olezhek28go 2 месяца назад
Ахах) Загадка про один тред то?
@vp_arth
@vp_arth 2 месяца назад
В js вообще всего один поток. И тем не менее конкурентности хватает)
@user-hd3qb8bm2e
@user-hd3qb8bm2e 4 месяца назад
серьезно? ноги целовать за знание элементарной базы? что не так в этом мире? хотя чему тут удивляться безработному программисту с 20 летнем стажем
@olezhek28go
@olezhek28go 4 месяца назад
Ну камон, ирония же была:)
Далее
ЭТО ВООБЩЕ НЕ БОЛЬНО !
00:15
Просмотров 352 тыс.
Что нужно знать о слайсах в Go?
28:34
ЭТО ВООБЩЕ НЕ БОЛЬНО !
00:15
Просмотров 352 тыс.