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

@go_interview_lib


Вопросы с собеседований по Go и ответы на них.

Список наших каналов: https://t.me/proglibrary/9197
Учиться у нас: https://proglib.io/w/0b524a15

Обратная связь: @proglibrary_feedback_bot

По рекламе: @proglib_adv
Прайс: @proglib_advertising

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

22 Oct, 20:45


Когда в Go следует использовать псевдонимы типов?

Type aliases — полезный инструмент, но их следует использовать с осторожностью. Вот несколько распространённых сценариев, в которых они могут быть особенно полезны:

🔸 Взаимодействие со сторонними библиотеками. Сторонние библиотеки часто используют сложные или неинтуитивно понятные имена типов. В таких случаях можно создать псевдоним типа, чтобы упростить работу с типами.

type JSONResponse = map[string]interface{}


🔸 Повышение удобочитаемости кода для конкретной предметной области. Если проект включает в себя модели предметной области или бизнес-логику, псевдонимы типов могут повысить читаемость.

type OrderID = string
type PaymentStatus = string

const (
Pending PaymentStatus = "pending"
Completed PaymentStatus = "completed"
Failed PaymentStatus = "failed"
)


🔸 Упрощение дженериков (Go 1.18+)
В Go 1.18 появились дженерики, которые позволяют функциям работать с любым типом данных. Псевдонимы типов могут упростить использование дженериков в сигнатурах функций.

type List[T any] = []T

func printList[T any](list List[T]) {
for _, item := range list {
fmt.Println(item)
}
}

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

21 Oct, 20:03


🧑‍💻 Статьи для IT: как объяснять и распространять значимые идеи

Напоминаем, что у нас есть бесплатный курс для всех, кто хочет научиться интересно писать — о программировании и в целом.

Что: семь модулей, посвященных написанию, редактированию, иллюстрированию и распространению публикаций.

Для кого: для авторов, копирайтеров и просто программистов, которые хотят научиться интересно рассказывать о своих проектах.

👉Материалы регулярно дополняются, обновляются и корректируются. А еще мы отвечаем на все учебные вопросы в комментариях курса.

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

21 Oct, 19:54


💬 В Go существует возможность скрывать методы с помощью встраивания структур. Как можно сделать так, чтобы метод, реализующий интерфейс, был скрыт при приведении типа, даже если он присутствует у встраиваемой структуры?

Например, есть тип A, который имеет метод Hello(). Когда мы передаём экземпляр A в функцию Greet(), приведение успешно выполнится к интерфейсу Greeter, и будет вызван метод Hello().

Теперь, допустим, мы хотим использовать тип A, но не хотим, чтобы его метод Hello() был доступен. Мы можем скрыть его с помощью embedding.

Когда мы вызываем Greet(ANoHello{A: A{}}), приведение типа к интерфейсу не удаётся.

Хотя ANoHello встраивает тип A, который имеет корректный метод Hello(), приоритет получает неэкспортируемый тип noHello, который скрывает метод Hello().

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

20 Oct, 20:33


📹 Секреты внутреннего устройства аллокатора Go: видеогайд от Владимира Балуна

⏱️ Таймкоды:

00:00 Введение
01:49 Концепция аллокатора
06:09 Линейный аллокатор
11:22 Блочный аллокатор
16:21 Стековый аллокатор
20:18 Устройство malloc
25:01 Недостатки malloc
26:55 Устройство tcmalloc
28:28 Устройство аллокатора Go
32:55 Предсказуемая фрагментация памяти
40:33 Где аллоцируются объекты в Go
51:11 Почему аллокация на стеке работает быстрее, чем в куче
52:35 Расширение и уменьшение стека в Go
58:12 Зачем это все нужно знать (практические примеры)
01:03:37 Пулы объектов (sync.Pool)
01:06:57 Арены (memory arenas)
01:14:30 Аллокатор ОС

▶️ YouTube | Rutube | VK

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

17 Oct, 20:54


💬 Для чего предназначен пакет flag в Go?

Пакет flag предоставляет возможность считывать аргументы командной строки (или флаги). Он поддерживает считывание различных типов данных, включая строки, целые числа и логические значения, что делает его универсальным для различных видов приложений.

Простой пример:

package main

import (
"flag"
"fmt"
)

func main() {
name := flag.String("name", "Worl "a name to say hello to")
flag.Parse()
fmt.Printf("Hello, %s!\n", *name)
}

go run main.go -name=Gopher


Hello, Gopher!


👉 Подробнее

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

15 Oct, 20:56


💬 Для чего предназначена директория internal в проекте на Go?

Директория internal в Go — это специальная структура проекта, которая делает код, находящийся внутри неё, доступным только для внутреннего использования в текущем модуле или его подмодулях. Она служит для того, чтобы скрыть детали реализации и предотвратить случайное или преднамеренное использование этого кода другими модулями или внешними проектами.

Преимущества:

▪️Инкапсуляция: мы сигнализируем, что код внутри internal является «частным» и не предназначен для использования другими модулями.
▪️Безопасность: Go автоматически запрещает импортировать код из директории internal, даже если кто-то захочет это сделать.
▪️Гибкость в рефакторинге: мы можем свободно изменять код и API внутри internal, не беспокоясь о том, что сломаем зависимости внешних пользователей.

Недостатки (особенности):

▪️Мы не можем импортировать код из internal, даже если позже это потребуется. Это может вызвать путаницу для новичков, которые не знают этой особенности.

👉 Подробнее

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

15 Oct, 06:03


Самые полезные каналы для программистов в одной подборке!

Сохраняйте себе, чтобы не потерять 💾

🔥Для всех

Библиотека программиста — новости, статьи, досуг, фундаментальные темы
Книги для программистов
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 запрещена на территории РФ

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

13 Oct, 16:30


💬 Объясните назначение основных методов sync.Map в Go.

sync.Map
в Go предоставляет набор атомарных методов для работы с мапой, поддерживающих конкурентный доступ:

Load, Store, Delete, Clear — это базовые операции, работающие так же, как методы обычной мапы в Go.
Swap заменяет старое значение новым и возвращает предыдущее значение. Этот метод также используется внутри Store().
LoadOrStore проверяет наличие ключа. Если ключ существует, метод возвращает текущее значение и loaded будет равно true. Если ключа нет, он сохраняет новое значение и возвращает его, при этом loaded будет равно false.
LoadAndDelete пытается загрузить значение по ключу. Если ключ существует, он удаляет его и возвращает значение, при этом loaded будет true. Если ключ не найден, возвращается false.
CompareAndDelete и CompareAndSwap — это условные операции. Эти методы удаляют или заменяют значение, только если текущее значение ключа соответствует старому. Если сравнение прошло успешно, ключ удаляется или обновляется, и метод возвращает true, иначе — false.
Range(f) позволяет итерировать по мапе, применяя функцию f к каждой паре ключ-значение. Если функция возвращает false, итерация прекращается (аналогично break в цикле for).

Все эти методы являются атомарными, но у Range есть особенность: мапа не блокируется на всё время итерации, что позволяет другим горутинам добавлять, изменять или удалять записи во время выполнения цикла.

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

12 Oct, 19:00


🎭 Двойная игра в Power BI: как совмещать роли разработчика и администратора

Когда твой руководитель говорит: «А теперь ты еще и администратор сервера Power BI». Гид по выживанию для разработчика, внезапно ставшего многостаночником.

Читать статью

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

12 Oct, 06:23


🤔 Основы математики в Machine Learning / Deep Learning

🗓 16 октября мы разберем ряд Тейлора, собственные векторы и другие ключевые понятия в ML – https://proglib.io/w/71ad9706

Спикер: Иван Потапов – Staff Machine Learning Engineer at ShareChat. Руководит командой, отвечающей за качество рекомендаций, и имеет 8-летний опыт в сфере машинного обучения.

😮 Что будем обсуждать:

– Теорию вероятностей: случайные величины, математическое ожидание и дисперсию.

Линейную алгебру: векторы, матрицы, собственные векторы и собственные значения.

Математический анализ: производные и разложение функций в ряд Тейлора.

👨‍💻 А еще после каждого блока вас ждет практика в применении полученных знаний.

🎯 Почему это важно?
Понимание математических основ помогает глубже разобраться в работающих под капотом алгоритмах ML/DL и эффективно применять их на практике.

Присоединяйтесь к нам и совершенствуйте свои навыки в машинном обучении!

📌 Регистрация по ссылке: https://proglib.io/w/71ad9706

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

10 Oct, 20:56


💬 Что такое JWT аутентификация и где она используется?

JWT (JSON Web Token) аутентификация — это способ передачи и проверки данных между сторонами в закодированном формате JSON. Токен состоит из трех частей: заголовка, claims и подписи, что делает его безопасным для передачи информации, так как данные могут быть проверены на подлинность, но не зашифрованы.

📌 Где используется:
JWT часто используется для:
1. Аутентификации — после успешного логина пользователю выдается JWT-токен, который прикрепляется к каждому последующему запросу для доступа к защищенным ресурсам.
2. Авторизации — токен может содержать информацию о правах доступа пользователя.

📌 Преимущества:
🔸 Позволяет безопасно передавать данные между клиентом и сервером.
🔸 JWT самодостаточен — не требует постоянной проверки на сервере, так как содержит всю необходимую информацию в себе.
🔸 Широко используется в REST API для аутентификации.

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

09 Oct, 20:50


Кстати, на Хабре опубликован перевод гайда про транзакции в БД на Go с использованием многослойной архитектуры 👉 https://t.me/goproglib/5276

Читайте, если хотите узнать об организации кода таким образом, чтобы избежать путаницы между слоями.

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

07 Oct, 20:02


🧑‍💻 Статьи для IT: как объяснять и распространять значимые идеи

Напоминаем, что у нас есть бесплатный курс для всех, кто хочет научиться интересно писать — о программировании и в целом.

Что: семь модулей, посвященных написанию, редактированию, иллюстрированию и распространению публикаций.

Для кого: для авторов, копирайтеров и просто программистов, которые хотят научиться интересно рассказывать о своих проектах.

👉Материалы регулярно дополняются, обновляются и корректируются. А еще мы отвечаем на все учебные вопросы в комментариях курса.

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

06 Oct, 20:44


💬 Можно ли реализовать set на Go?

Set — это структура данных, которая хранит уникальные элементы и позволяет быстро проверять их наличие, добавлять и удалять их, без дубликатов. В Go нет встроенного типа для множеств, но мы можем использовать тип map с ключами нужного типа, а в качестве значения использовать struct{}, который не занимает память:

package main

import "fmt"

// Set — коллекция уникальных элементов
type Set struct {
elements map[string]struct{}
}

// NewSet создает новое множество
func NewSet() *Set {
return &Set{elements: make(map[string]struct{})}
}

// Add добавляет элемент
func (s *Set) Add(value string) {
s.elements[value] = struct{}{}
}

// Remove удаляет элемент
func (s *Set) Remove(value string) {
delete(s.elements, value)
}

// Contains проверяет наличие элемента
func (s *Set) Contains(value string) bool {
_, found := s.elements[value]
return found
}

// List возвращает все элементы в виде среза
func (s *Set) List() []string {
keys := make([]string, 0, len(s.elements))
for key := range s.elements {
keys = append(keys, key)
}
return keys
}

// Пример использования множества
func main() {
set := NewSet()
set.Add("apple")
set.Add("banana")
fmt.Println("Contains 'apple':", set.Contains("apple"))
fmt.Println("Set elements:", set.List())
set.Remove("banana")
fmt.Println("Set after removal:", set.List())
}


Основные операции с множествами:

- Union: создаёт множество, содержащее все элементы из двух множеств.
- Intersection: возвращает множество с элементами, общими для двух множеств.
- Difference: возвращает множество элементов, которые есть в первом множестве, но отсутствуют во втором.

Пример:
set1 := NewSet()
set1.Add("apple")
set1.Add("banana")
set2 := NewSet()
set2.Add("banana")
set2.Add("orange")
unionSet := set1.Union(set2)
fmt.Println("Union:", unionSet.List()) // ["apple", "banana", "orange"]


Производительность: все основные операции с помощью множеств (добавление, удаление, проверка) выполняются за время O(1) благодаря использованию мапы.

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

04 Oct, 20:57


📉👩‍💻 Руководство по сборщику мусора Go

Одна из тех самых страниц документации, которая должна быть под рукой у Go-разраба. В ней есть все о том, как работает система сборки мусора Go, с дополненным полезными интерактивными диаграммами.

👉 Читать

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

03 Oct, 20:58


Назовите лучшие практики работы с интерфейсами в Go.

1. Маленькие интерфейсы проще реализовывать и мокать.

type Reader interface {
Read(p []byte) (n int, err error)
}

вместо
type ReadCloser interface {
Read(p []byte) (n int, err error)
Close() error
}


2. Использование интерфейсов в параметрах функций для обеспечения гибкости в реализации.

func CopyData(r Reader, w Writer) error {
buf := make([]byte, 1024)
for {
n, err := r.Read(buf)
if err != nil {
return err
}
if n == 0 {
break
}
if _, err := w.Write(buf[:n]); err != nil {
return err
}
}
return nil
}


3. Возврат конкретных типов, когда нужно предоставить полный набор функциональности.

func NewBuffer() *bytes.Buffer {
return &bytes.Buffer{}
}


4. Использование композиции интерфейсов: создание сложных интерфейсов на основе более простых.

type ReadCloser interface {
Reader
Closer
}


5. Избегание чрезмерного использования интерфейсов: преждевременное введение абстракций может усложнить код и сделать его менее читаемым.

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

02 Oct, 20:48


Вы создаете приложение, которому необходимо выполнять код через определённый промежуток времени или с регулярными интервалами. Какие пакеты будете использовать?

Go предоставляет для этого time.Timer и time.Ticker.

• Timers: срабатывают один раз по истечении заданного времени.
• Tickers: запускаются повторно с фиксированными интервалами.

Вот как можно использовать функцию time.Timer, чтобы подождать 2 секунды перед выполнением кода:

package main

import (
"fmt"
"time"
)

func main() {
timer := time.NewTimer(2 * time.Second)
<-timer.C
fmt.Println("Timer expired!")
}


а вот и ticker, который запускается каждую секунду:

package main

import (
"fmt"
"time"
)

func main() {
ticker := time.NewTicker(1 * time.Second)
for t := range ticker.C {
fmt.Println("Tick at", t)
}
}

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

01 Oct, 09:42


💻🔍💼 Кризис IT-рынка: как джуны и кадровый голод меняют правила игры

В условиях нехватки опытных специалистов и наплыва джунов, IT-компании вынуждены искать нестандартные подходы к найму. Рассмотрим основные тренды и стратегии адаптации рынка.

Читать статью

#почитать