Mock-собеседование Go разработчика из OZON | Самое полное интервью

Подготовка к собеседованию на Golang Developer

Транскрипция видео:

  • Олег привет сегодня на собеседование по гоу я поспрашивать вопросы по глупы по основам программирования никаких алгоритмов системных заданий ничего не будет то есть только вопрос готов Да Окей хорошо Давай начнем И начнём пожалуй наверное со строк Расскажи как строки устроены был под капотом это слайс байтом или руну в зависимости от того что-то там хранить больше ну типа если какие-нибудь Анти символы то ой доски то тогда там одного байта хватит на символ если руны ну там два три четыре В зависимости от того что

    00:00:00 - 00:01:12

  • там за символа Вот соответственно когда мы что-то в строке Ну такая-то очень изменяемый объект и соответственно когда мы кусок создаётся Ну выделяется снова память это типа активно Поэтому если есть нужда как-то там что-то альтернативно использовать Ну в принципе что тут мудрить просто свай с какой-нибудь берем в него Ну там можно если мы знаем заранее размер какой-то можно предвыделить память и ну выделить то есть попасть и указать [музыка] если не знаю Ну да можно поиграться с тем что кусками будем выделять чтобы вот

    00:00:36 - 00:02:13

  • Чуть более сатимизировать какие-то истории в принципе еще можно раскинуть то есть же массивы И вот я честно устроены скорее всего хранятся Я точно не помню в принципе можно начать что-нибудь там хранить на стейки Ну какое-то ограниченное количество понятное дело то там хотя бы чтобы мы говорим про оптимизация была сможешь когда маленькая строчка или маленький буфер он может там со стекой начинать расти Окей супер хорошо что возвращает Лен для строчки и что возвращает оператор квадратные скобочка для строчки

    00:01:32 - 00:03:12

  • вообще на него не стоит операции [музыка] метод который возвращается Хорошо смотри получается какая ситуация от 1 до 4 байт может символ занимать и получается у нас ноги строки они могут быть не фиксированы то есть у нас может один символ один байт 2-3 там 123 как потом runtime Go понимает а Сколько байт каждый из каждых символов занимает то есть не знаешь как там кодируется нет столько сколько мне последующие символ будет занимать байт Нет примерно помню точно не нужно своими словами там плюс минус как это можно было бы разруливать

    00:02:25 - 00:03:46

  • можно было бы наверное в конце строк Можно конечно Просто который говорит о том что дальше следует 3 байка последовательность Окей супер Хорошо давай тогда еще такой вопрос последний постройка представим Давай себе возобним разработчики и допустим рентабельные сроки как ты сказал да У нас есть массивчик на указательный какой-то памяти длина и она имеет табельная как еще можно делать сроки Ну представим и пишем голову каким и мы хотим обсуждать Как можно строки у нас делать языки [музыка] в принципе ты один уже из вариантов

    00:03:25 - 00:04:59

  • назвал сам массив который будет автоматически расширяться то есть ментабельные строки Нет я понял ну то есть мы говорили тот имитабельный который сейчас год мы рассматриваем другие альтернативные которые еще можно было бы использовать [музыка] не Ну конечно нужно приходить каким-то образом если тебя какой-то кейс такой когда тебе нужно Не знаю примеру хранить обращаться Конкретно покручу этот сложный кейс это Окей дерево попахивает Не ну можно Я не знаю какой то не просто кусок памяти выделяет и

    00:04:20 - 00:05:55

  • хранить сейчас кстати вот 20 подвозят Арену в экспериментальном режиме Но это типа как плюсах по сути можно память выделять и чистить Можно я просто имею ввиду на какие-то алгоритмы допустим связанных списках это очень редкий кейс тоже можно было придумать есть когда строчку Не ну можно конечно Просто такой ситуации нам не нужно обращаться по элементам до какого-то индекс А часто приходится в середину там начало вставлять как бы тоже если вполне возможно это очень редкий что принципе тоже имеет место быть копия нравится

    00:05:24 - 00:06:31

  • слышал Нет строки часто используется в разных языках программирования копируем мы копируем просто указатель на буфер и длину и мы не будем копировать саму строчку не будем копировать свои байты до тех пор пока не Будем изменять как только нам потребуется вот Окей хорошо строки думаю все супер А давай поговорим наверное популярный вопрос власти и массивы В чём разница Ну массив по сути фиксированный памяти как я уже упомянул вероятнее всего на стейки то есть мы должны указать по сути его длину перед компиляцией то есть

    00:06:02 - 00:07:19

  • должен быть уже в курсе и слайс по сути является такой абстракцией над этими массивами которые позволяют делать динамический размер то есть под капотом слайса лежит указатель на массив и два поля длина и емкость ну и соответственно случае там переполнения данного выделенного куска памяти идет перелокация это позволяет обеспечить нам динамическое содержимое Как работает с динамическими массивами Ну смотря в каких рассмотрим ставку удаления и взятие на обращение к одному элементу Ну типа смотри обращение к

    00:06:42 - 00:08:18

  • одному элементу Ну по индексу например совместились потом что ставка Ну типа если мы в конец вставляем И у нас не переполнилась содержимое массива Ну по памяти то тоже ничего делать не надо просто засунули в конец и все Если мы вставляем в начале в конец нам надо будет смещать часть целый массив потому что нужно добиться того чтобы следовать амортизированная Константа как раз таки за счёт того что иногда Придётся перевынять делать три локации О'кей а удаление Давай поговорим из начала из Конца динамического сила

    00:07:32 - 00:08:47

  • Ну если мы удаляем из начала нам все равно придется опять все смещать из Конца докурили удалили что там Я не слышал чтобы там было такое что если только акции мы потом сужать не будем буферно так очень редко кто-то делает потому что операции Вот а если я хочу удалить и сначала за константу как это можно сделать не нужно в теории Если так подумать то можно конечно Просто перезаписать указательств но сделать слайсинг подвинут этот элемент правильно порядок элементов внутри генетическом массива не важно

    00:08:18 - 00:09:40

  • порядок не важен Да конечно по порядку я могу их менять местами если что подсказка а ты имеешь ввиду вот эту историю когда ненужные элементы конец окружают Ну например если хочу удалить первые элементы порядок не важно последним и последний удаляю за константу с опыта Константа возвращает слайс Почему просто там не принимать по указателю например почему она возвращает Ну типа не я понимаю что это сулит некоторые проблемы когда вот люди могут сразу не раздуплить что он там реально новый слайс возвращает новую структуру

    00:09:04 - 00:10:28

  • Там могут возникнуть проблемы что ну типа они такие функцию передали слайс его локальную переменную указатели вот у них не обновится нихрена вот этот Лента или копать если перевыделение было Вот и соответственно Go будет думать что массив короче чем он есть Ну то есть там в памяти было в гол как бы там такой правило что ли Это же читал где-то что те методы которые как модифицировать которые добавляют желательно делать так чтобы они возвращали этот слайс то есть это дискриптор слайса вот как раз таки из-за

    00:09:57 - 00:11:09

  • того что ну ты можешь ожидать что увеличится не увеличится потому что вернется старый буфер Окей давай последний просто послать сам А ставка и чтение из инициализированного слайса от него Ну то есть ставка допустим opent в ней инициализированный в Нил слайс отработает или нет да обращение к какому-то индексу не инициализированного слайса если кому-то индексу то он тебе скажет вышел за пределы доступного Ну понятно Окей супер Давай таблицу еще таблицы как бы устроена мапы Точнее я уже проговорился

    00:10:36 - 00:11:46

  • ну как по сути взлома по это соответственно это если в верхнем уровне смотреть то это просто контейнер данных ключе значения он не отсортирован естественно [музыка] если бы как плюсах был вот этот на основе дерева можно было бы делать когда вставляем у нас ключ проходит функцию получать вот это значение такое это США Ну тут надо оговориться о свойствах функций что типа во-первых устроены таким образом что то что в ходе дает всегда выходить один и тот же результат Потому что если бы скорость повторяю она

    00:11:12 - 00:12:44

  • похожая короче по близкие ключи старается делать хэши их далекими скажем так друг другу по значению чтобы более-менее равномерно распределять по диапазону хэшей вот Ну естественно могут возникать коллизии Когда у нас разные ключи на фоне дают один и тот же Хеш них попозже поговорить дальше в общем что происходит Дальше там опыт капотом баке существует значений которые могут туда класться грубо говоря типа Бакет отвечает за какой-то диапазон хешей посчитанный он какой-то пакет складывается Вот И там есть этот

    00:12:02 - 00:13:18

  • механизм эвакуации данных что он там среднем это считает по пакетом в среднем 6,5 будет ёмкость заполненность он эвакуации данных делать в отличие от слайса где это все сразу происходит там это размазано Потому что если типа не знаю 1000 элементов mype это переезжать будет достаточно долго и чтобы чуть-чуть оптимизировать это это в какой-то момент времени там хранится два указателя Ну в элитных Old память типа да и ну и он потихоньку при операциях там ставке или точно не помню В общем когда ты сама поделаешь потихоньку

    00:12:48 - 00:14:05

  • начинает помимо добавлений там новых данных перекидывать в Новую память и в какой-то момент перекинет и всё Мы будем жить прилетаем и к примеру у нас там уже забился такое мы можем начать платить конкретно диапазон связанный Ну и когда идет операция чтение он залетает в пакет надо проверять Если никого не нашел он дальше смотрит Если еще один пакет связан списке если есть там проверяет если там уже не нашел Ну все сорян нет такого Согласен согласен То есть это метод основой цепочек А еще какие знаешь

    00:13:29 - 00:14:39

  • методы разрешения Колизей Ну там еще по моему есть вариант самый тупой вариант это только попробовать там типа сунуть в другой какой-нибудь когда я про него читал он мне показался более непонятным скажем так открыто адресация Там просто разные механизм пробирование то есть либо Ты в следующий либо ты квадратичная начинаешь пробирование то есть там больше больше использовать но Окей Хорошо смотри Давай еще что типа спрашиваю ставка и чтение инициализированные вставка и чтение Ну вставка это конечно

    00:14:11 - 00:15:28

  • печально Это типичная чтение докачу это же будет просто история про то что он по ключу несуществующему читаю Хорошо давай рассмотрим такую ситуацию смотри представим что мы разработчики там не знаю Тиньков инвестиций и нам нужно написать мапку у которой в качестве ключа будет цена какого-то актива допустим там бумаги какой-то да там не знаю 100 рублей 50 копеек 200 рублей 37 копеек Неважно а в качестве значения у нас будет слайс название бумаг допустим Тиньков и ВК там стоит 10 рублей 53 копейки индекс стоит 40 рублей

    00:15:00 - 00:16:20

  • 37 копеек вот значения будем хранить слайс стронг А в качестве ключа какой тип данных будем использовать Забавно кстати момент в том что мы как раз вчера мы готовимся к Новому потоку Рута и вчера обсуждали про финансы Как хранить Ну типа сошлись во мнению что ну самое удобное тут похоронить в как-то атомарной единицы валюты Ну то есть для рубля это копейки то есть выйти хранишь копейки умножать на 100 при вставки делить Это первый вариант еще если использовать Это очевидно еще варианты не нужно конечно типа

    00:15:41 - 00:16:57

  • структуру заявить еще еще можно сохранить не Ну конечно там Можно сидеть играться бывает там допустим подрубли тоже Как пример со строками и так далее Я уже считать не буду вот Окей хорошо Давай пойдем в runtime Go наверное Что такое гарантин модно Отвечать по сути Ну сущность которая управляется ниже дуллером операционной системы Ну типа в отличие от потока у него рутины где-то читал что на инициализацию тренда операционной системы 12 тысяч операций процессорных она во-вторых понятное дело Буратино выгодно

    00:16:22 - 00:18:01

  • отличает высокой тем что динамические расширяемых и можно из этого плюшки определенные естественно вся вот эта история по менеджменту она будет быстрее происходить эмоционально потому что вот этот Шнур Ну как там же как выделяются эти вот потоки операционной системы в рамках которые действуют грудины соответственно сам процесс ой процесс поток зафиксирован и мы уже ну не так сказать не носируем операционной системы мы просто тут внутри что-то копаемся и это позволяет тоже ускорить процесс Ну и банально это со мной

    00:17:32 - 00:19:02

  • поприятнее чем в плюсах там городить вот эти тренды написал Кои Все поехал Давай посмотрим какой пример представим гол Макс прокс знаешь что такое нет переменная что отвечает Ну это отвечает насколько будут использовать Ну то есть сколько потоков Точнее за каждым потоком по очереди будут гарантийные Окей То есть у меня будет один поток и на один процессор на очередь я что делаю я функции беру завожу берутинку и там пишу бесконечный цикл что будет Ну Начнем с того что когда мы пишем domax Fox 1 это мы в какую-то мы теряем

    00:18:16 - 00:19:40

  • вот эту синхронность как будто бы смотри там вот по поводу этого цикла там был прикол в том что до какой-то версии Go это прокатывала Ну то что он получился и не переключал от других это версия пофиксили и он уже понимает что это какая-то шляпа и он будет окей да ну если функция мы там войти его не будем просто даже не успеем запустить Там просто это завершится А давай еще один кейс рассмотрим такой интересный представим мы с тобой пишем какой-то сервак если типичный но есть допустим патч он синхронный Да есть синхронной и

    00:19:02 - 00:20:20

  • мы вот короче ты перед выбором нам нужно написать сервак и мы ожидаем очень много операций прям куча все сколов будем делать операционной системе и нас какие есть выбор мы можем там Аля создать блочное предложение наградить что гаран которые чем они будут заниматься не постоянно будут что-то на 10 писать или что-то считывать короче постоянно будет делать или у нас есть вариант сделать те же самые 100 процессов гошных или взять какой-то другой язык программирования делать это в рамках процессов То есть у нас были там сто

    00:19:44 - 00:20:43

  • процентов что будет быстрее работать Ну учитывая то что там был системный вызову то типа это есть признак переключения контекста и он будет шевелить и как бы учитывая что дуринг будет происходить в рамках Но это будет наверное побыстрее чем просто такая что есть отдельный поток который занимается школами Вот картинка идет это грудинка паркуется на этом потоке соответственно если тесто грудинок то получается просто будут парковаться на этот поток интересная Окей хорошо Давай тоже немного как канал устроен

    00:20:13 - 00:21:31

  • это структура Ну по сути Ну стоит договориться для начала что они бывают буферизированными буферизированные в случае не буферизированных каналов насколько я помню Там просто перебрасывается инфа эстетов у разных груди случае буферизированного канала там имеется Ну естественно там еще идет сохранение очень грубо говоря оно происходит Мы допустим что-то пишем в канал если канал то будет писаться будет возможность писать этот канал до тех пор как буфер не забьется если буфер забился то мы как-то будет зависание происходить не

    00:21:00 - 00:22:24

  • знаешь нет какие-то механизмы Как это работает соответственно круто в другом висеть как только начали вычитывать он уже начнет его отпускать вот ну и та же самая популяризированными просто буфера Нет там также будет ждать и все там под капотом естественно чтобы ты заговорил при самки нужно очень следует помнить то что можно бороться как это правильно называется редко но все равно иногда приходится очень Как аккуратно это подходить ну для начала надо подумать стоит Я согласен очень редкий кейс но мне

    00:21:44 - 00:23:03

  • практики пару раз приходилось но бывает иногда как-то нужно быть аккуратным аккуратно к этому подходить а ну наверное нет смысла вот правила придерживаться как с этим вместе 1221 порядок согласованный должен быть да то есть порядок если чтобы не было такое что один начал первым получить а другой другим тогда конечно А Еще какой вариант есть не слышал Нет там иерархические индекса нет грубо говоря когда мы каждому свою иерархию и потом блочить допустим нижележащий То есть это согласованность порядка

    00:22:50 - 00:24:05

  • будет на уровне будет конечно писать какие-то реализации Окей два контекста Как устроены Какие знаешь виды Ну контекст можно назвать пульс программы Такой типа история которая прокидывается почти везде Ну по дефолту там в общем-то хранится Ну чаще всего его использовать для того чтобы регулировать то есть там можно либо задать время когда он сдохнет либо промежуток через который помрет ну и соответственно это когда контекст меняется идет сигнал канал специальный и соответственно него можно реагировать

    00:23:32 - 00:25:00

  • Например нужно для того чтобы когда у тебя запущена пачка чтобы синхронизировать чтобы красиво завершится так скажем кроме этого можно контекст накидывать свои какие-то значения там если этого интерфейс методы которые позволяют докинуть Ну типа Можно докинуть информацию [музыка] Чем отличается аналог тем что когда мы снимаем делаем мы указываем сколько ему жить когда Да это по сути весь канал отличается контекста Ground я не помню может что-то еще навернули смысловой нагрузка чего пока это туда потом нужно

    00:24:16 - 00:25:53

  • будет какой-то другой смысленный контекст поставить и Давайте вопрос последний по контекстам Допустим мы хотим написать контекст тайм-аут как мы напишем [музыка] голову приходит после этого и там куда-нибудь в Канаду которая слепится на этот тайм-аут да Супер Давай поговорим про обобщенное программирование допустим представим нас нет был один 18 хотим писать помещенный код какие у нас есть способы для того чтобы писать Да их когда и завезли то не то что стали Все моим окружении не то чтобы стали сильно

    00:25:20 - 00:26:34

  • юзать некоторые кейсы Ну типа самое часто используемая раньше это конечно пустые интерфейсы и то есть это интерфейс которому соответствует что угодно вот и оно конечно гибкости добавляет но определенные риски несет то есть тебе нужно все время обрабатывать те типы данных которые собираешься поддерживать если ты там где-то что-то недоработал ну все только так можно что-нибудь сломать вот генерации не пользовался Нет там раньше тоже Ну да в принципе тоже можно юзать ее Вот кстати как раз для обработки

    00:26:18 - 00:27:41

  • Джейсона стандартной библиотека Как ни странно капец Какая медленная и вот в частности Джейсон генератор генерации юзает он ну прекрасно работает в этом плане А так еще А ну мы тут еще в своем отделе тоже свою очередь [музыка] своих личных Ну вот мы в частности сейчас задумка еще пока не доделать через это дерево Ну типа берешь изначально говоришь типа Чувак у меня вот есть такая модель хочу для неё пошло сделать типа там какой-нибудь стандартный вот ну и там он держал в памяти какой-то шаблон который

    00:27:05 - 00:28:30

  • мы хотим использовать он просто дерево напихивает туда нужные сущности и кот выплёвывает вот кодогенерации писали Да если сами писали или нет или что-то использовали А в коже есть же пакет прям они тебя прям создатели классическое дерево Я не слышал Прям вообще классно ты берешь прям файл Закидываешь что хочешь Окей хорошо Так ну давай последний вопрос Типа если бы эти классические постулаты наследование то наследование привычного нету Есть вариант заменить его композицию В принципе Почему [музыка]

    00:27:47 - 00:29:21

  • они такие пожалуйста избегайте наследования когда вам это не надо то все сломаете ну и соответственно просто есть два варианта встраивания [музыка] и другая структура указательным объект есть просто Вставить без какого-то названия поля и это будет копирование методами не нужно будет промежуточное звено указывать при обращении к методу что дальше дальше инкапсуляция Ну типа если мы говорим про вскрытие какое-то Да вот данных то в этих во взрослых языках как говорится использовать всякие там паблики и так

    00:28:43 - 00:30:12

  • далее гораздо проще тут можно просто взять и написать с маленькой буквы Это было правило типа с большой буквы на Ютубе наткнулся на кого-то чувака который типа эксперт по голосу и он такой ну Пишем с большой буквы так просто принято в гору я такой Ну да да что там осталось флюорографизм какой-то множественное Поведение у одного и того же объекта но реализовано через интерфейсы то есть мы берем интерфейс заводим парочку структуру которая реализует этот интерфейс все методы которые здесь присутствуют и они

    00:29:42 - 00:30:57

  • какой-то праздник классический пример берем интерфейс в репостное и реализуем для разных баз данных и достаточно Просто потом инициализировать нужный объект А во всем остальном конь там сервисном слое и так далее можем использовать объект интерфейса и нас вообще не колышек что там какая база данных используется интерфейс Окей как интерфейс устроена внутри Ты не поверишь это тоже структура самое важное интерфейсы стоит то что у него есть динамическое значение динамический и Об этом можно очень сильно обжечь

    00:30:22 - 00:31:40

  • То есть во-первых он хранит информацию Конечно вот об этих методах он требует и хранит но если мы создаем какой-то уже конкретный объект он будет хранить информацию о том конкретном имя который классический пример Что например мы можем из функций вернуть Допустим мы говорим возвращаем значение интерфейс если мы напишем ритуал то действительно объект вернется он будет считаться потому что оба поля динамический они будут по нему но если мы создадим указатель на конкретный тип мы такие указательств это же типа тоже

    00:31:01 - 00:32:23

  • нифига объекты интерфейса уже будет понимание конкретный тип пытается его реализовать у него будет значение nill но и соответственно на проверке Ну например ошибку мы возвращаем вот так ошибка мы можем короче ну просто пропустить ошибку согласен а могу интерфейс одного типа присвоить интерфейс другого типа Да при условии что ну смотрим это классический тоже примерки если у тебя структура сразу интерфейса Ну типа все методы и того и другого то вообще без проблем костятся если что-то не хватает то конечно не получится окей Окей хорошо

    00:31:44 - 00:33:03

  • У меня наверное все давай последнее что хотел спросить как можно приорит тип интерфейса Я не знаю там пустой допустим интерфейс пришел хочу узнать что с этим стоит Как можно это проверить Ну можно свечом там свитч еще что можно сделать Ну попробовать кастить можно и там окне ОК но это совершенно и я имею ввиду reflection ну рефлексу как бы редко там есть вариант получаешь Я честно скажу дженерик Я не особо трогаю так поигрался чуть-чуть окей Окей хорошо Ну у меня всего как бы у тебя есть какие-то вопросы Мне все

    00:32:23 - 00:33:39

  • понравилось все круто отвечал у меня знаешь единственный вопрос как это всегда типа вот из плюсов на год перешел какого-то впечатления Поделитесь со своими зрителями Я плюсы не забываю я пишу там что-то свое какие-то задачки решать какие-то проектики чтобы плюсы не забывать меня просто понимаешь что на голову писать промышленный код намного удобнее Потому что реверсе почти никакого нет нет такой ситуации что ты как бы зарылся в чем-то в плюсах или в сичке с каким-то секунды почти каждый день ты зарываешься

    00:33:15 - 00:34:22

  • непонятно что где как было нет было благоприятно всё это

    00:33:49 - 00:34:00