mirror of
https://github.com/goavengers/go-interview.git
synced 2026-02-04 04:36:19 +00:00
3
.gitignore
vendored
3
.gitignore
vendored
@@ -1 +1,2 @@
|
|||||||
.idea
|
.idea
|
||||||
|
.vscode
|
||||||
59
README.md
59
README.md
@@ -50,13 +50,12 @@
|
|||||||
- Что такое шардинг и репликация?
|
- Что такое шардинг и репликация?
|
||||||
- coming soon
|
- coming soon
|
||||||
6. [Вопросы по языку Golang](docs/GOLANG.md)
|
6. [Вопросы по языку Golang](docs/GOLANG.md)
|
||||||
- Что из себя представляет тип данных string в языке Golang? Можно ли изменить определенный символ в строке? Что происходит при склеивании строк?
|
- [Что из себя представляет тип данных string в языке Golang? Можно ли изменить определенный символ в строке? Что происходит при склеивании строк?](docs/GOLANG.md#1)
|
||||||
- Вытекающий вопрос — как эффективно склеивать множество строк?
|
- [Вытекающий вопрос — как эффективно склеивать множество строк?](docs/GOLANG.md#2)
|
||||||
- Что будет происходить при конкурентной записи в map? Как можно решить эту проблему?
|
- Что будет происходить при конкурентной записи в map? Как можно решить эту проблему?
|
||||||
- Расскажите о ООП в Golang.
|
- Расскажите о ООП в Golang.
|
||||||
- В чем различия goroutine от потока системы?
|
- В чем различия goroutine от потока системы?
|
||||||
- Как огранить число потоков на системы при запуске Golang программы и возможно ли огранить их до 1 потока?
|
- Как огранить число потоков на системы при запуске Golang программы и возможно ли огранить их до 1 потока?
|
||||||
- Как устроен слайс и чем он отличается от массива?
|
|
||||||
- [Как задать направление канала?](docs/GOLANG.md#8)
|
- [Как задать направление канала?](docs/GOLANG.md#8)
|
||||||
- [Напишите собственную функцию Sleep, используя time.After](docs/GOLANG.md#9)
|
- [Напишите собственную функцию Sleep, используя time.After](docs/GOLANG.md#9)
|
||||||
- [Что такое буферизированный канал? Как создать такой канал с ёмкостью в 20 сообщений?](docs/GOLANG.md#10)
|
- [Что такое буферизированный канал? Как создать такой канал с ёмкостью в 20 сообщений?](docs/GOLANG.md#10)
|
||||||
@@ -83,32 +82,32 @@
|
|||||||
9. [Вопросы от Данила Подольского на позицию Senior Golang Backend Developer в компанию Evrone](docs/PODOLSKY.md)
|
9. [Вопросы от Данила Подольского на позицию Senior Golang Backend Developer в компанию Evrone](docs/PODOLSKY.md)
|
||||||
- [Go — императивный или декларативный? А в чем разница?](docs/PODOLSKY.md#1)
|
- [Go — императивный или декларативный? А в чем разница?](docs/PODOLSKY.md#1)
|
||||||
- [Что такое type switch?](docs/PODOLSKY.md#2)
|
- [Что такое type switch?](docs/PODOLSKY.md#2)
|
||||||
- Как сообщить компилятору, что наш тип реализует интерфейс?
|
- [Как сообщить компилятору, что наш тип реализует интерфейс?](docs/PODOLSKY.md#3)
|
||||||
- Как работает append?
|
- [Как работает append?](docs/PODOLSKY.md#4)
|
||||||
- Какое у slice zero value? Какие операции над ним возможны?
|
- [Какое у slice zero value? Какие операции над ним возможны?](docs/PODOLSKY.md#5)
|
||||||
- Как устроен тип map?
|
- [Как устроен тип map?](docs/PODOLSKY.md#6)
|
||||||
- Каков порядок перебора map?
|
- [Каков порядок перебора map?](docs/PODOLSKY.md#7)
|
||||||
- Что будет, если читать из закрытого канала?
|
- [Что будет, если читать из закрытого канала?](docs/PODOLSKY.md#8)
|
||||||
- Что будет, если писать в закрытый канал?
|
- [Что будет, если писать в закрытый канал?](docs/PODOLSKY.md#9)
|
||||||
- Как вы отсортируете массив структур по алфавиту по полю Name?
|
- [Как вы отсортируете массив структур по алфавиту по полю Name?](docs/PODOLSKY.md#10)
|
||||||
- Что такое сериализация? Зачем она нужна?
|
- [Что такое сериализация? Зачем она нужна?](docs/PODOLSKY.md#11)
|
||||||
- Сколько времени в минутах займет у вас написание процедуры обращения односвязного списка?
|
- [Сколько времени в минутах займет у вас написание процедуры обращения односвязного списка?](docs/PODOLSKY.md#12)
|
||||||
- Где следует поместить описание интерфейса: в пакете с реализацией или в пакете, где этот интерфейс используется? Почему?
|
- [Где следует поместить описание интерфейса: в пакете с реализацией или в пакете, где этот интерфейс используется? Почему?](docs/PODOLSKY.md#13)
|
||||||
- Предположим, ваша функция должна возвращать детализированные Recoverable и Fatal ошибки. Как это реализовано в пакете net? Как это надо делать в современном Go?
|
- [Предположим, ваша функция должна возвращать детализированные Recoverable и Fatal ошибки. Как это реализовано в пакете net? Как это надо делать в современном Go?](docs/PODOLSKY.md#14)
|
||||||
- Главный недостаток стандартного логгера?
|
- [Главный недостаток стандартного логгера?](docs/PODOLSKY.md#15)
|
||||||
- Есть ли для Go хороший orm? Ответ обоснуйте.
|
- [Есть ли для Go хороший orm? Ответ обоснуйте.](docs/PODOLSKY.md#16)
|
||||||
- Какой у вас любимый линтер?
|
- [Какой у вас любимый линтер?](docs/PODOLSKY.md#17)
|
||||||
- Можно ли использовать один и тот же буфер []byte в нескольких горутинах?
|
- [Можно ли использовать один и тот же буфер []byte в нескольких горутинах?](docs/PODOLSKY.md#18)
|
||||||
- Какие типы мьютексов предоставляет stdlib?
|
- [Какие типы мьютексов предоставляет stdlib?](docs/PODOLSKY.md#19)
|
||||||
- Что такое lock-free структуры данных, и есть ли в Go такие?
|
- [Что такое lock-free структуры данных, и есть ли в Go такие?](docs/PODOLSKY.md#20)
|
||||||
- Способы поиска проблем производительности на проде?
|
- [Способы поиска проблем производительности на проде?](docs/PODOLSKY.md#21)
|
||||||
- Стандартный набор метрик prometheus в Go -программе?
|
- [Стандартный набор метрик prometheus в Go -программе?](docs/PODOLSKY.md#22)
|
||||||
- Как встроить стандартный профайлер в свое приложение?
|
- [Как встроить стандартный профайлер в свое приложение?](docs/PODOLSKY.md#23)
|
||||||
- Overhead от стандартного профайлера?
|
- [Overhead от стандартного профайлера?](docs/PODOLSKY.md#24)
|
||||||
- Почему встраивание — не наследование?
|
- [Почему встраивание — не наследование?](docs/PODOLSKY.md#25)
|
||||||
- Какие средства обобщенного программирования есть в Go?
|
- [Какие средства обобщенного программирования есть в Go?](docs/PODOLSKY.md#26)
|
||||||
- Какие технологические преимущества языка Go вы можете назвать?
|
- [Какие технологические преимущества языка Go вы можете назвать?](docs/PODOLSKY.md#27)
|
||||||
- Какие технологические недостатки языка Go вы можете назвать?
|
- [Какие технологические недостатки языка Go вы можете назвать?](docs/PODOLSKY.md#28)
|
||||||
10. [Популярные задачи на собеседованиях](docs/POPULAR_TASKS.md)
|
10. [Популярные задачи на собеседованиях](docs/POPULAR_TASKS.md)
|
||||||
- [На вход подаются два неупорядоченных слайса любой длины. Надо написать функцию, которая возвращает их пересечение](docs/POPULAR_TASKS.md#1)
|
- [На вход подаются два неупорядоченных слайса любой длины. Надо написать функцию, которая возвращает их пересечение](docs/POPULAR_TASKS.md#1)
|
||||||
- [Написать генератор случайных чисел](docs/POPULAR_TASKS.md#2)
|
- [Написать генератор случайных чисел](docs/POPULAR_TASKS.md#2)
|
||||||
@@ -119,4 +118,4 @@
|
|||||||
|
|
||||||
## Как мне добавить свой вопрос-ответ?
|
## Как мне добавить свой вопрос-ответ?
|
||||||
|
|
||||||
- [Ознакомтесь с шаблоном составления](TEMPLATE.md)
|
- [Ознакомьтесь с шаблоном составления](TEMPLATE.md)
|
||||||
|
|||||||
@@ -1,5 +1,23 @@
|
|||||||
## <a name="golang_questions"></a> Вопросы по языку Golang
|
## <a name="golang_questions"></a> Вопросы по языку Golang
|
||||||
|
|
||||||
|
### <a name="1"></a> 1. Что из себя представляет тип данных string в языке Golang? Можно ли изменить определенный символ в строке? Что происходит при склеивании строк?
|
||||||
|
|
||||||
|
Строка Go - это байтовый срез, предназначенный только для чтения, который может содержать байты любого типа и иметь произвольную длину. Строка неизменяемая и изменить определенный символ в конкретной строке нельзя. Создается новая строка (в простейшем случае).
|
||||||
|
|
||||||
|
### <a name="2"></a> 2. Вытекающий вопрос — как эффективно склеивать множество строк?
|
||||||
|
|
||||||
|
Например, чтобы избавиться от лишних аллокаций, можно воспользоваться типом strings.Builder и методом WriteString:
|
||||||
|
```go
|
||||||
|
func join(strs ...string) string {
|
||||||
|
var sb strings.Builder
|
||||||
|
for _, str := range strs {
|
||||||
|
sb.WriteString(str)
|
||||||
|
}
|
||||||
|
return sb.String()
|
||||||
|
}
|
||||||
|
```
|
||||||
|
И никто не мешает пользоваться пакетом strings.
|
||||||
|
|
||||||
### <a name="8"></a> 8. Как задать направление канала?
|
### <a name="8"></a> 8. Как задать направление канала?
|
||||||
|
|
||||||
Мы можем задать направление передачи сообщений в канале, сделав его только отправляющим или принимающим. Например:
|
Мы можем задать направление передачи сообщений в канале, сделав его только отправляющим или принимающим. Например:
|
||||||
@@ -154,7 +172,7 @@ GC выполняется конкурентно (concurrent), одноврем
|
|||||||
3. Идет перебор серых объектов, проверяются ссылки на другие объекты и помечаются на черные объекты. Если есть ссылка на белый объект, то белый становится серым.
|
3. Идет перебор серых объектов, проверяются ссылки на другие объекты и помечаются на черные объекты. Если есть ссылка на белый объект, то белый становится серым.
|
||||||
4. Продолжается до тех пор, пока не будут перебраны все серые объекты.
|
4. Продолжается до тех пор, пока не будут перебраны все серые объекты.
|
||||||
5. Оставшиеся после перебора белые объекты считаются недостижимыми и занимаемая ими область памяти может быть освобождена.
|
5. Оставшиеся после перебора белые объекты считаются недостижимыми и занимаемая ими область памяти может быть освобождена.
|
||||||
Есть еще Мутатор - это приложение, работающее во время сборки мусора. Вызывает функцию барьера записи. Выполняется каждый раз, когда меняется указатель в куче. После изменения указателя объект считаеться достижимым и помечается как серый.
|
Есть еще Мутатор - это приложение, работающее во время сборки мусора. Вызывает функцию барьера записи. Выполняется каждый раз, когда меняется указатель в куче. После изменения указателя объект считается достижимым и помечается как серый.
|
||||||
|
|
||||||
### <a name="18"></a> 18.Что такое interface, как они работают в Go?
|
### <a name="18"></a> 18.Что такое interface, как они работают в Go?
|
||||||
`// todo`
|
`// todo`
|
||||||
|
|||||||
@@ -9,4 +9,101 @@
|
|||||||
|
|
||||||
### <a name="2"></a> Что такое type switch?
|
### <a name="2"></a> Что такое type switch?
|
||||||
|
|
||||||
Сравнение типов переменной, а не ее значений.
|
Сравнение типов переменной, а не ее значений.
|
||||||
|
|
||||||
|
### <a name="3"></a> Как сообщить компилятору, что наш тип реализует интерфейс?
|
||||||
|
|
||||||
|
Если наш тип реализует все методы интерфейса, значит он реализует этот интерфейс.
|
||||||
|
|
||||||
|
### <a name="4"></a> Как работает append?
|
||||||
|
|
||||||
|
Если capacity исходного массива достаточно, он используется повторно. В противном случае выделяется новый базовый массив достаточной длины и данные копируются
|
||||||
|
|
||||||
|
### <a name="5"></a> Какое у slice zero value? Какие операции над ним возможны?
|
||||||
|
|
||||||
|
Zero value у slice == nil
|
||||||
|
Возможные операции: len, cap, append.
|
||||||
|
|
||||||
|
### <a name="6"></a> Как устроен тип map?
|
||||||
|
|
||||||
|
Map в Go это хэш таблица, позволяющая хранить пары ключ-значение и обладающая следующими функциями: маппинг, вставка, удаление, поиск. Map in Go не упорядоченная. Место поиска определяется рандомно. Когда мы пытаемся получить значение из мапы, а его там нет, получаем «нулевое значение типа», что в случае числа 0. Map — ссылочный тип и мало объявить переменную, надо ее проинициализировать.
|
||||||
|
|
||||||
|
### <a name="7"></a> Каков порядок перебора map?
|
||||||
|
|
||||||
|
Случайным образом.
|
||||||
|
|
||||||
|
### <a name="8"></a> Что будет, если читать из закрытого канала?
|
||||||
|
|
||||||
|
Вернется нулевое значение.
|
||||||
|
|
||||||
|
### <a name="9"></a> Что будет, если писать в закрытый канал?
|
||||||
|
|
||||||
|
Произойдет вызов panic.
|
||||||
|
|
||||||
|
### <a name="10"></a> Как вы отсортируете массив структур по алфавиту по полю Name?
|
||||||
|
|
||||||
|
С помощью функции sort.SliceStable. Для этого сначала конвертируем массив в слайс.
|
||||||
|
```go
|
||||||
|
slice := array[:]
|
||||||
|
```
|
||||||
|
|
||||||
|
### <a name="11"></a> Что такое сериализация? Зачем она нужна?
|
||||||
|
|
||||||
|
Сериализация — это преобразование объекта в какой-либо формат с тем, чтобы потом tuj можно было восстановить из этого формата. Допустим, после передачи как набора байт по сети.
|
||||||
|
|
||||||
|
### <a name="12"></a> Сколько времени в минутах займет у вас написание процедуры обращения односвязного списка?
|
||||||
|
|
||||||
|
Тут каждый считает сам. Попробуйте с таймингом (засеките время).
|
||||||
|
|
||||||
|
### <a name="13"></a> Где следует поместить описание интерфейса: в пакете с реализацией или в пакете, где этот интерфейс используется? Почему?
|
||||||
|
|
||||||
|
Небольшое копирование лучше, чем небольшая зависимость. Даже в стандартной библиотеке есть места, где те же io.Reader или fmt.Stringer переопределены, чтобы избежать ненужной зависимости от других пакетов. Если интерфейс маленький, скопировать его не составит труда, а если он большой, то есть вероятность, что в будущем одному модулю понадобятся одни методы, а другому - другие.
|
||||||
|
|
||||||
|
### <a name="14"></a> Предположим, ваша функция должна возвращать детализированные Recoverable и Fatal ошибки. Как это реализовано в пакете net? Как это надо делать в современном Go?
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
### <a name="15"></a> Главный недостаток стандартного логгера?
|
||||||
|
|
||||||
|
|
||||||
|
### <a name="16"></a> Есть ли для Go хороший orm? Ответ обоснуйте.
|
||||||
|
|
||||||
|
Для работы с базами данных можно использовать пакет database/sql. Но есть куча ORM, можно выбрать любую. Все зависит от исходной посылки.
|
||||||
|
|
||||||
|
### <a name="17"></a> Какой у вас любимый линтер?
|
||||||
|
|
||||||
|
Go vet + golint
|
||||||
|
|
||||||
|
### <a name="18"></a> Можно ли использовать один и тот же буфер []byte в нескольких горутинах?
|
||||||
|
|
||||||
|
|
||||||
|
### <a name="19"></a> Какие типы мьютексов предоставляет stdlib?
|
||||||
|
|
||||||
|
|
||||||
|
### <a name="20"></a> Что такое lock-free структуры данных, и есть ли в Go такие?
|
||||||
|
|
||||||
|
|
||||||
|
### <a name="21"></a> Способы поиска проблем производительности на проде?
|
||||||
|
|
||||||
|
|
||||||
|
### <a name="22"></a> Стандартный набор метрик prometheus в Go-программе?
|
||||||
|
|
||||||
|
|
||||||
|
### <a name="23"></a> Как встроить стандартный профайлер в свое приложение?
|
||||||
|
|
||||||
|
|
||||||
|
### <a name="24"></a> Overhead от стандартного профайлера?
|
||||||
|
|
||||||
|
|
||||||
|
### <a name="25"></a> Почему встраивание — не наследование?
|
||||||
|
|
||||||
|
|
||||||
|
### <a name="26"></a> Какие средства обобщенного программирования есть в Go?
|
||||||
|
|
||||||
|
Обобщенное программирование — это форма, в которой мы подключаем шаблоны, известные как дженерики, которые на самом деле не являются истинным исходным кодом, но компилируются компилятором для преобразования их в исходный код. [Дженерики будут](https://go.googlesource.com/proposal/+/refs/heads/master/design/43651-type-parameters.md) с версии 1.18.
|
||||||
|
|
||||||
|
### <a name="27"></a> Какие технологические преимущества языка Go вы можете назвать?
|
||||||
|
|
||||||
|
|
||||||
|
### <a name="28"></a> Какие технологические недостатки языка Go вы можете назвать?
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user