ar
Feedback
Библиотека Go для собеса | вопросы с собеседований

Библиотека Go для собеса | вопросы с собеседований

الذهاب إلى القناة على Telegram

Вопросы с собеседований по Go и ответы на них. Учиться у нас: clc.to/iEeaZw По рекламе: @proglib_adv Для обратной связи: @proglibrary_feeedback_bot Наши каналы: https://t.me/proglibrary/9197

إظهار المزيد
7 427
المشتركون
-424 ساعات
-117 أيام
+230 أيام
أرشيف المشاركات
🎉 Розыгрыш от Proglib Academy и DigitalRazor! С 27 ноября по 27 декабря у вас есть шанс не только прокачать свои навыки, но
🎉 Розыгрыш от Proglib Academy и DigitalRazor! С 27 ноября по 27 декабря у вас есть шанс не только прокачать свои навыки, но и выиграть ПК при покупке любого курса Академии! 🎁 Призы для участников акции: – Игровой ПК DigitalRazor ProGamingVIP-пакет курса Proglib Academy 💡 Как принять участие? Купите любой курс Proglib Academy с 27 ноября по 27 декабря и получите шанс выиграть мощный ПК. Приобретите технику DigitalRazor — участвуйте в розыгрыше VIP курса. 📅 Вместе с DigitalRazor мы создали спецпредложение -50% на курсы до 30 ноября, чтобы вы могли начать обучение на более выгодных условиях. Выбрать курс

❓ Как форматировать исходный код на Go идиоматично? Идиоматичный Go-код — это код, написанный в соответствии с общепринятыми стилевыми и архитектурными стандартами языка Go, отражающий лучшие практики и философию языка. 🎯 Идиоматичное форматирование Go-кода достигается с помощью встроенного инструмента gofmt, который автоматически приводит код к стандартному стилю, обеспечивая консистентность отступов и пробелов. Рекомендуется использовать goimports для управления импортами, автоматически добавляя или удаляя их по необходимости. Интеграция этих инструментов в редакторы кода, такие как VS Code или GoLand, позволяет автоматически форматировать код при сохранении.

⚡️ Напоминаем: у нас можно (и нужно) купить рекламу → Более 60 телеграм-каналов по всем направлениям IT → Почти 1,2 миллиона аудитории → Собственное медиа и сайт с DAU 25 000 — можем усилить продвижение → Классные email-рассылки → И, конечно же, крутые контент-менеджеры, которые сделают нативную интеграцию/придумают виральный пост/реализуют любые контентные предпочтения Для заказа пишите сюда: @proglib_adv

❓ Как используется оператор select в Go? Оператор select в Go используется для работы с несколькими каналами одновременно. Это позволяет горутине ожидать события на нескольких каналах и блокировать выполнение до тех пор, пока не произойдёт одно из событий (например, получение данных с канала). 🛠️ select работает подобно конструкции switch, но вместо проверки значений переменных, она проверяет операции с каналами. Когда одна из операций с каналом завершается, выполняется соответствующий блок кода.

Лучшие ресурсы, чтобы не отставать от трендов из мира Go. 👣 Golang Go - авторский канал, посвященный Go разработке, Devops и созданию высоконагруженных сервисов. 📚 Golang books редкая литература , статьи, курсы и уникальные гайды для Golang специалистов любого уровня. Читайте, развивайтесь, практикуйте. 💼 Golang Jobs — актуальные предложения для Golang разработчиков от самых крупных работодателей и лидеров рынка.

Черные скидки на курсы в Академии! -40% до конца ноября 🔥 В честь Черной пятницы до 30 ноября запускаем распродажу на все ку
Черные скидки на курсы в Академии! -40% до конца ноября 🔥 В честь Черной пятницы до 30 ноября запускаем распродажу на все курсы proglib.academy и дарим промокод на сумму 10 000 на технику в магазине DigitalRazor (отправим вам по запросу) 🎁 Анонс новогоднего сюрприза! 🎄 Те, кто успеет приобрести курсы с 27 ноября по 27 декабря, получат шанс выиграть крутой новогодний подарок. Что это будет, пока держим в секрете – следите за новостями на нашем канале! Почему стоит выбрать нас? ⚫️ Опытные преподаватели Вас будут обучать доценты ВМК МГУ по математике, а алгоритмы расскажет разработчик из Яндекса и преподаватель МФТИ и НИУ ВШЭ. ⚫️ Бессрочный доступ ко всем курсам Проходите обучение в удобном для вас темпе, без давления жестких сроков. ⚫️ Поддержка преподавателей Не останетесь одни — вам всегда помогут разобраться с трудными темами и ответят на любые вопросы через чат и платформу Coreapp. 👉 Не уверены, подойдет ли вам курс? Начните с бесплатных вводных занятий и познакомьтесь с преподавателями и форматом обучения – Ждем вас на обучении! 🙌

Черные скидки на курсы в Академии! -40% до конца ноября 🔥 В честь Черной пятницы до 30 ноября запускаем распродажу на все ку
Черные скидки на курсы в Академии! -40% до конца ноября 🔥 В честь Черной пятницы до 30 ноября запускаем распродажу на все курсы proglib.academy и дарим промокод на сумму 10 000 на технику в магазине DigitalRazor (отправим вам по запросу) 🎁 Анонс новогоднего сюрприза! 🎄 Те, кто успеет приобрести курсы с 27 ноября по 27 декабря, получат шанс выиграть крутой новогодний подарок. Что это будет, пока держим в секрете – следите за новостями на нашем канале! Почему стоит выбрать нас? ⚫️ Опытные преподаватели Вас будут обучать доценты ВМК МГУ по математике, а алгоритмы расскажет разработчик из Яндекса и преподаватель МФТИ и НИУ ВШЭ. ⚫️ Бессрочный доступ ко всем курсам Проходите обучение в удобном для вас темпе, без давления жестких сроков. ⚫️ Поддержка преподавателей Не останетесь одни — вам всегда помогут разобраться с трудными темами и ответят на любые вопросы через чат и платформу Coreapp. 👉 Не уверены, подойдет ли вам курс? Начните с бесплатных вводных занятий и познакомьтесь с преподавателями и форматом обучения – Ждем вас на обучении! 🙌

❓Как избежать состояния гонки? ✅Используйте мьютексы (sync.Mutex): Мьютекс блокирует доступ к ресурсу, пока горутина не освободит его. Пример:
gopackage main
import ( 
    «fmt» 
    «sync»
)
var counter int
var mu sync.Mutex
func increment(wg *sync.WaitGroup) { 
    defer wg.Done() 
    for i := 0; i < 1000; i++ { 
        mu.Lock() // Блокируем доступ 
        counter++ 
        mu.Unlock() // Освобождаем доступ 
    }
}
func main() { 
    var wg sync.WaitGroup 
    wg.Add(2) 
    go increment(&wg) 
    go increment(&wg) 
    wg.Wait() 
    fmt.Println(«Counter:», counter) // Правильное значение}
✅Используйте каналы для синхронизации: Каналы позволяют передавать данные между горутинами, избегая прямого доступа к разделяемой памяти. Пример:
gopackage main
import «fmt»
func main() { 
    ch := make(chan int) 
    go func() { 
        sum := 0 
        for i := 0; i < 1000; i++ { 
            sum++ 
       } 
       ch <- sum 
   }() 
result := <-ch 
fmt.Println(«Result:», result) // Гарантированно корректное значение}
✅Используйте атомарные операции (sync/atomic): Для операций инкремента, декремента и чтения/записи целых чисел используйте пакет sync/atomic. Пример:
gopackage main
import ( «fmt» «sync» «sync/atomic»)

var counter int64
func increment(wg *sync.WaitGroup) { 
    defer wg.Done() 
    for i := 0; i < 1000; i++ { 
        atomic.AddInt64(&counter, 1) // Атомарное увеличение
     }
}
func main() { 
    var wg sync.WaitGroup 
    wg.Add(2) 
    go increment(&wg) 
    go increment(&wg) 
    wg.Wait() 
    fmt.Println(«Counter:», counter) // Корректное значение}
✅Минимизируйте разделяемое состояние: Старайтесь проектировать программу так, чтобы каждая горутина работала с собственными данными. Это снижает вероятность состояния гонки. Используйте инструменты для обнаружения состояния гонки: ✅ Go предоставляет встроенный инструмент -race для выявления состояния гонки. Пример запуска:
go run -race main.go
✅ Понимайте порядок работы горутин: Горутины не гарантируют порядок выполнения. Используйте механизмы синхронизации (sync.WaitGroup, каналы) для управления их завершением.

💬 Почему добавление элементов в nil-срез работает, а добавление в nil-мапу вызывает панику? В Go срезы и тип map работают по-разному: 1. Срезы: 🔸 nil-срез — это валидный срез с нулевой длиной (len == 0) и нулевой ёмкостью (cap == 0). 🔸 Когда мы вызываем append() на nil-срезе, Go выделяет новую память и создаёт срез с достаточной ёмкостью для хранения новых элементов. Поэтому добавление элементов в nil-срез работает без ошибок. Пример:
var a []int
a = append(a, 4, 5, 6) // Создаётся новый срез в памяти
fmt.Println(a)         // [4 5 6]
2. Тип map 🔸 nil-мапа неинициализирована и не имеет памяти для хранения пар ключ-значение. 🔸 Любая попытка добавить элемент в nil-мапу вызовет панику, так как мапа не готова к использованию. 🔸 Для работы с мапой её нужно явно инициализировать с помощью функции make. Пример:
var m map[int]int
// m[1] = 1 // Вызовет панику
m = make(map[int]int)
m[1] = 1 // Теперь работает

👨‍💻🚀 Тест: насколько ты продвинутый разраб? Говорят, что джун становится мидлом, когда начинает понимать, как мало он знае
👨‍💻🚀 Тест: насколько ты продвинутый разраб? Говорят, что джун становится мидлом, когда начинает понимать, как мало он знает. Этот тест покажет, насколько ты продвинулся в своём развитии. 👉 Ворваться

🦫 Самоучитель по Go для начинающих. Часть 17. Основы сетевого программирования. Стек TCP/IP. Сокеты. Пакет net В этой части
🦫 Самоучитель по Go для начинающих. Часть 17. Основы сетевого программирования. Стек TCP/IP. Сокеты. Пакет net В этой части самоучителя мы погрузимся в мир сетевого программирования, изучим его основные концепции и инструменты. Начнем с рассмотрения принципов работы компьютерных сетей и их архитектуры, познакомимся с протоколами TCP и IP, лежащими в основе стека TCP/IP. Затем детально изучим сокеты и их роль в сетевом взаимодействии. Особое внимание будет уделено пакету net, который предоставляет удобные инструменты для реализации сетевых приложений. 👉 Читать гайд 👩‍💻 Остальные части в серии: 1. Особенности и сфера применения Go, установка, настройка 2. Ресурсы для изучения Go с нуля 3. Организация кода. Пакеты, импорты, модули. Ввод-вывод текста. 4. Переменные. Типы данных и их преобразования. Основные операторы 5. Условные конструкции if-else и switch-case. Цикл for. Вложенные и бесконечные циклы 6. Функции и аргументы. Области видимости. Рекурсия. Defer 7. Массивы и слайсы. Append и сopy. Пакет slices 8. Строки, руны, байты. Пакет strings. Хеш-таблица (map) 9. Структуры и методы. Интерфейсы. Указатели. Основы ООП 10. Введение в ООП. Наследование, абстракция, полиморфизм, инкапсуляция 11. Обработка ошибок. Паника. Восстановление. Логирование 12. Обобщенное программирование. Дженерики 13. Работа с датой и временем. Пакет time 14. Интерфейсы ввода-вывода. Буферизация. Работа с файлами. Пакеты io, bufio, os 15. Конкурентность. Горутины. Каналы 16. Тестирование кода и его виды. Table-driven подход. Параллельные тесты

💬 Почему копирование структур в Go может привести к неожиданным результатам? Приведите пример. Копирование структур может быть проблематичным, если структура содержит указатели или срезы, которые при копировании продолжают ссылаться на ту же область памяти, что и оригинал. Например, структура bytes.Buffer содержит срез []byte. Если скопировать объект Buffer, методы, вызванные на копии, могут изменять данные в оригинале, так как оба объекта используют одну и ту же память.
package main

import (
  "bytes"
  "fmt"
)

func main() {
  // Создаем оригинальный буфер
  original := bytes.Buffer{}
  original.WriteString("Hello")

  // Копируем буфер
  copyBuffer := original

  // Добавляем данные в копию
  copyBuffer.WriteString(", World!")

  // Проверяем содержимое оригинала
  fmt.Println(original.String()) // Вывод: "Hello, World!"
}
В этом примере срез []byte в копии copyBuffer ссылается на тот же массив, что и в оригинале original. Поэтому изменения в одном буфере затрагивают другой.

🤔🎄🎁 Какой подарок вы бы хотели на Новый год? Да, начинать готовиться никогда не рано 😉 #интерактив
🤔🎄🎁 Какой подарок вы бы хотели на Новый год? Да, начинать готовиться никогда не рано 😉 #интерактив

Сможешь ли ты пройти собес? Смотри собеседование на Middle Go-разработчика в прямом эфире в этот четверг 👨‍💻 21 ноября в 19
Сможешь ли ты пройти собес? Смотри собеседование на Middle Go-разработчика в прямом эфире в этот четверг 👨‍💻 21 ноября в 19:00 (мск) Аким Саввин, Team-lead в ВСК (ex-CTO в европейском стартапе ALT), проведет открытое собеседование на Middle-позицию: – Задаст реальные вопросы и задачи разработчику. – Даст подробную обратную связь: объяснит, зачем задавал тот или иной вопрос, как лучше на него ответить или решить задачу. Эфир будет полезен, если ты: – Планируешь повысить свой грейд в Go, чтобы увеличить ЗП или сменить компанию. – Хочешь сменить свой текущий стек на Go. – Готовишься к собеседованию прямо сейчас и хочешь получить оффер. Это бесплатно? Бесплатно 👾 Регистрируйся на эфир в боте Эйч Навыков и получи грейд-карту навыков по Go, необходимых при найме в бигтех-компаниях.

🧑‍💻 Статьи для IT: как объяснять и распространять значимые идеи Напоминаем, что у нас есть бесплатный курс для всех, кто хо
🧑‍💻 Статьи для IT: как объяснять и распространять значимые идеи Напоминаем, что у нас есть бесплатный курс для всех, кто хочет научиться интересно писать — о программировании и в целом. Что: семь модулей, посвященных написанию, редактированию, иллюстрированию и распространению публикаций. Для кого: для авторов, копирайтеров и просто программистов, которые хотят научиться интересно рассказывать о своих проектах. 👉Материалы регулярно дополняются, обновляются и корректируются. А еще мы отвечаем на все учебные вопросы в комментариях курса.

💬 Какой подход лучше использовать для объявления пустого среза в Go и почему? Предпочтительнее использовать var t []string вместо t := []string{}. Первый вариант объявляет срез как nil, в то время как второй вариант создаёт не-nil срез нулевой длины. Они функционально эквивалентны — их len и cap равны нулю, — но стиль с nil-срезом считается предпочтительным. Важно учитывать, что есть ситуации, когда предпочтителен не-nil срез с нулевой длиной. Например, при кодировании JSON: nil-срез кодируется как null, а []string{} — как пустой JSON-массив [].

💬 Почему для генерации ключей в Go нельзя использовать math/rand, и как правильно сгенерировать безопасный ключ? 1. Без явного вызова rand.Seed() генератор math/rand всегда возвращает одну и ту же последовательность чисел. 2. Если использовать time.Now().UnixNano() как seed, доступно всего несколько бит энтропии, что делает последовательности легко предсказуемыми. 3. math/rand не подходит для криптографических задач, так как его алгоритм детерминированный и может быть взломан. crypto/rand Reader — альтернативный вараинт , а если нам нужен текст, можно вывести его в шестнадцатеричном формате или в формате base64:
import (
    "crypto/rand"
    // "encoding/base64"
    // "encoding/hex"
    "fmt"
)

func Key() string {
    buf := make([]byte, 16)
    _, err := rand.Read(buf)
    if err != nil {
        panic(err)  // out of randomness, should never happen
    }
    return fmt.Sprintf("%x", buf)
    // or hex.EncodeToString(buf)
    // or base64.StdEncoding.EncodeToString(buf)
}

💬 Как интерфейс io.WriterTo оптимизирует передачу данных в Go и как io.Copy() решает, какой метод использовать? Интерфейс io.WriterTo позволяет объекту-источнику напрямую записывать данные в объект-получатель через метод WriteTo(w Writer). Это устраняет необходимость промежуточного буфера, делая передачу данных более эффективной. io.Copy() проверяет, реализует ли объект-источник интерфейс WriterTo или объект-получатель интерфейс ReaderFrom: 🔸 Если источник реализует WriterTo, вызывается WriteTo(). 🔸 Если получатель реализует ReaderFrom, вызывается ReadFrom(). 🔸 Если ни один из интерфейсов не реализован, используется внутренний буфер (по умолчанию 32 КБ). Этот механизм позволяет сократить количество операций копирования и ускорить передачу данных, особенно для оптимизированных системных вызовов, таких как sendfile в Linux.

Самые полезные каналы для программистов в одной подборке! Сохраняйте себе, чтобы не потерять 💾 🔥Для всех Библиотека программиста — новости, статьи, досуг, фундаментальные темы Книги для программистов IT-мемы Proglib Academy — тут мы рассказываем про обучение и курсы Азбука айтишника — здесь мы познаем азы из мира программирования 🤖Про нейросети Библиотека робототехники и беспилотников | Роботы, ИИ, интернет вещей Библиотека нейрозвука | Транскрибация, синтез речи, ИИ-музыка Библиотека нейротекста | ChatGPT, Gemini, Bing Библиотека нейровидео | Sora AI, Runway ML, дипфейки Библиотека нейрокартинок | Midjourney, DALL-E, Stable Diffusion #️⃣C# Книги для шарпистов | C#, .NET, F# Библиотека шарписта — полезные статьи, новости и обучающие материалы по C# Библиотека задач по C# — код, квизы и тесты Библиотека собеса по C# — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования Вакансии по C#, .NET, Unity Вакансии по PHP, Symfony, Laravel ☁️DevOps Библиотека devops’а — полезные статьи, новости и обучающие материалы по DevOps Вакансии по DevOps & SRE Библиотека задач по DevOps — код, квизы и тесты Библиотека собеса по DevOps — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования 🐘PHP Библиотека пхпшника — полезные статьи, новости и обучающие материалы по PHP Вакансии по PHP, Symfony, Laravel Библиотека PHP для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования Библиотека задач по PHP — код, квизы и тесты 🐍Python Библиотека питониста — полезные статьи, новости и обучающие материалы по Python Вакансии по питону, Django, Flask Библиотека Python для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования Библиотека задач по Python — код, квизы и тесты ☕Java Книги для джавистов | Java Библиотека джависта — полезные статьи по Java, новости и обучающие материалы Библиотека Java для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования Библиотека задач по Java — код, квизы и тесты Вакансии для java-разработчиков 👾Data Science Книги для дата сайентистов | Data Science Библиотека Data Science — полезные статьи, новости и обучающие материалы по Data Science Библиотека Data Science для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования Библиотека задач по Data Science — код, квизы и тесты Вакансии по Data Science, анализу данных, аналитике, искусственному интеллекту 🦫Go Книги для Go разработчиков Библиотека Go разработчика — полезные статьи, новости и обучающие материалы по Go Библиотека Go для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования Библиотека задач по Go — код, квизы и тесты Вакансии по Go 🧠C++ Книги для C/C++ разработчиков Библиотека C/C++ разработчика — полезные статьи, новости и обучающие материалы по C++ Библиотека C++ для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования Библиотека задач по C++ — код, квизы и тесты Вакансии по C++ 💻Другие каналы Библиотека фронтендера Библиотека мобильного разработчика Библиотека хакера Библиотека тестировщика Библиотека разработчика игр | Gamedev, Unity, Unreal Engine Вакансии по фронтенду, джаваскрипт, React, Angular, Vue Вакансии для мобильных разработчиков Вакансии по QA тестированию InfoSec Jobs — вакансии по информационной безопасности 📁Чтобы добавить папку с нашими каналами, нажмите 👉сюда👈 Также у нас есть боты: Бот с IT-вакансиями Бот с мероприятиями в сфере IT Мы в других соцсетях: 🔸VK 🔸YouTube 🔸Дзен 🔸Facebook * 🔸Instagram * * Организация Meta запрещена на территории РФ

💬 Как json.Unmarshal обрабатывает совпадения ключей в JSON при разном регистре, и какой результат будет при наличии нескольких ключей, отличающихся только регистром? Функция json.Unmarshal при декодировании JSON-сообщений в структуру Go сначала пытается найти точное совпадение ключа. Если точное совпадение не найдено, она принимает ключи, совпадающие с именем поля структуры без учёта регистра. Если в JSON присутствуют несколько ключей, которые отличаются только регистром, json.Unmarshal выберет последнее упомянутое значение с учётом регистра. Например, если в JSON имеются ключи "HTML" и "html", то при декодировании в поле HTML структуры будет записано значение из последнего из них. В приведённом ниже коде JSON содержит два ключа "HTML" и "html" с разными значениями, но функция Unmarshal записывает значение из последнего ключа ("bar") в поле HTML структуры:
package main

import (
  "encoding/json"
  "fmt"
)

type T struct {
  HTML string `json:"HTML"`
}

var s = `{"HTML": "foo", "html": "bar"}`

func main() {
  var t T
  if err := json.Unmarshal([]byte(s), &t); err != nil {
    fmt.Println(err)
    return
  }
  fmt.Println(t.HTML) // bar
}
Таким образом, при наличии нескольких ключей с одинаковым именем, но разным регистром, json.Unmarshal предпочтёт последнее значение.