Подготовка к собеседованию на позицию Go-разработчика? Эти вопросы помогут вам освежить знания и уверенно пройти технические этапы.
1. Что такое Go, и в чем его основные преимущества?
Ответ: Go (Golang) — это язык программирования, разработанный Google. Его основные преимущества:
- Простота: лаконичный синтаксис, легкость изучения.
- Параллелизм: встроенная поддержка goroutines и каналов.
- Производительность: компилируется в машинный код, что делает программы быстрыми.
- Кроссплатформенность: легко компилируется для разных платформ.
- Модульная система: с Go Modules управление зависимостями стало проще.
2. Чем goroutine отличается от потоков?
Ответ:
- Goroutine — это легковесная сущность, управляемая самим Go, для выполнения параллельного кода.
- Основные отличия:
- Goroutines занимают значительно меньше памяти (примерно 2 КБ).
- Их количество может исчисляться тысячами (в отличие от потоков).
- Планирование goroutines осуществляется Go runtime, а не операционной системой.
3. Как работают каналы в Go?
Ответ: Каналы в Go используются для синхронизации и передачи данных между goroutines.
- Типы каналов:
- Буферизированные: передают данные, пока буфер не заполнен.
- Небуферизированные: требуют, чтобы получатель и отправитель взаимодействовали одновременно.
- Основные операции:
chan <-— отправка данных.<- chan— получение данных.
- Пример:
goCopy codech := make(chan int)
go func() {
ch <- 42
}()
fmt.Println(<-ch) // 42
4. Чем отличается slice от array в Go?
Ответ:
- Array — фиксированный размер, неизменяемый.
- Slice — динамическая структура, построенная на основе массива.
- Slice имеет ссылку на underlying array, что делает его изменяемым.
- Пример создания:goCopy code
arr := [5]int{1, 2, 3, 4, 5} slice := arr[1:4] // [2, 3, 4]
5. Как работает defer?
Ответ:
- Defer откладывает выполнение функции до момента выхода из текущей функции.
- Особенности:
- Выполняются в обратном порядке добавления.
- Полезно для освобождения ресурсов (например, закрытие файлов или соединений).
- Пример:
goCopy codefunc main() {
defer fmt.Println("World")
fmt.Println("Hello")
}
// Вывод:
// Hello
// World
6. Что такое интерфейсы в Go и как они работают?
Ответ:
- Интерфейс в Go — это набор методов.
- Тип реализует интерфейс, если он реализует все его методы.
- Интерфейсы полезны для описания поведения без указания конкретной реализации.
- Пример:
goCopy codetype Speaker interface {
Speak() string
}
type Human struct{}
func (h Human) Speak() string {
return "Hello"
}
7. Как избежать data race в Go?
Ответ:
- Использовать каналы для передачи данных между goroutines.
- Использовать sync.Mutex для синхронизации доступа к общим данным.
- Использовать sync/atomic для атомарных операций.
- Пример с Mutex:
goCopy codevar mu sync.Mutex
var counter int
func increment() {
mu.Lock()
counter++
mu.Unlock()
}
8. Чем отличаются panic и recover?
Ответ:
- Panic используется для критических ошибок, когда выполнение программы не может продолжаться.
- Recover позволяет перехватить
panicи предотвратить краш программы. - Пример:
goCopy codefunc main() {
defer func() {
if r := recover(); r != nil {
fmt.Println("Recovered from:", r)
}
}()
panic("Something went wrong")
}
9. Что такое garbage collector в Go?
Ответ:
- Garbage collector (GC) автоматически освобождает память, занятую неиспользуемыми объектами.
- В Go используется tracing GC, который:
- Работает параллельно с программой.
- Снижает паузы при сборке мусора.
- Это упрощает управление памятью, но нужно учитывать, что работа GC может вызывать накладные расходы.
10. Как в Go организовать модульный проект?
Ответ:
- Использовать Go Modules.
- Шаги:
- Инициализировать модуль:
go mod init <module_name>. - Управлять зависимостями через
go mod tidyиgo get. - Организовать код по папкам (
cmd,pkg,internal).
- Инициализировать модуль:
- Пример структуры:
csharpCopy codeproject/
├── cmd/ // точка входа
├── pkg/ // общие библиотеки
├── internal/ // внутренние пакеты
└── go.mod
Эти вопросы с ответами помогут разработчикам на любом уровне подготовки. Добавьте их в свой чек-лист перед собеседованием и повышайте шансы на успех!