Merge pull request #2 from dreddsa5dies/podolsky

Вопросы по строкам
This commit is contained in:
Andrey Kapitonov
2022-02-23 22:42:12 +03:00
committed by GitHub
4 changed files with 148 additions and 33 deletions

3
.gitignore vendored
View File

@@ -1 +1,2 @@
.idea
.idea
.vscode

View File

@@ -50,13 +50,12 @@
- Что такое шардинг и репликация?
- coming soon
6. [Вопросы по языку Golang](docs/GOLANG.md)
- Что из себя представляет тип данных string в языке Golang? Можно ли изменить определенный символ в строке? Что происходит при склеивании строк?
- Вытекающий вопрос как эффективно склеивать множество строк?
- [Что из себя представляет тип данных string в языке Golang? Можно ли изменить определенный символ в строке? Что происходит при склеивании строк?](docs/GOLANG.md#1)
- [Вытекающий вопрос как эффективно склеивать множество строк?](docs/GOLANG.md#2)
- Что будет происходить при конкурентной записи в map? Как можно решить эту проблему?
- Расскажите о ООП в Golang.
- В чем различия goroutine от потока системы?
- Как огранить число потоков на системы при запуске Golang программы и возможно ли огранить их до 1 потока?
- Как устроен слайс и чем он отличается от массива?
- [Как задать направление канала?](docs/GOLANG.md#8)
- [Напишите собственную функцию Sleep, используя time.After](docs/GOLANG.md#9)
- [Что такое буферизированный канал? Как создать такой канал с ёмкостью в 20 сообщений?](docs/GOLANG.md#10)
@@ -83,32 +82,32 @@
9. [Вопросы от Данила Подольского на позицию Senior Golang Backend Developer в компанию Evrone](docs/PODOLSKY.md)
- [Go императивный или декларативный? А в чем разница?](docs/PODOLSKY.md#1)
- [Что такое type switch?](docs/PODOLSKY.md#2)
- Как сообщить компилятору, что наш тип реализует интерфейс?
- Как работает append?
- Какое у slice zero value? Какие операции над ним возможны?
- Как устроен тип map?
- Каков порядок перебора map?
- Что будет, если читать из закрытого канала?
- Что будет, если писать в закрытый канал?
- Как вы отсортируете массив структур по алфавиту по полю Name?
- Что такое сериализация? Зачем она нужна?
- Сколько времени в минутах займет у вас написание процедуры обращения односвязного списка?
- Где следует поместить описание интерфейса: в пакете с реализацией или в пакете, где этот интерфейс используется? Почему?
- Предположим, ваша функция должна возвращать детализированные Recoverable и Fatal ошибки. Как это реализовано в пакете net? Как это надо делать в современном Go?
- Главный недостаток стандартного логгера?
- Есть ли для Go хороший orm? Ответ обоснуйте.
- Какой у вас любимый линтер?
- Можно ли использовать один и тот же буфер []byte в нескольких горутинах?
- Какие типы мьютексов предоставляет stdlib?
- Что такое lock-free структуры данных, и есть ли в Go такие?
- Способы поиска проблем производительности на проде?
- Стандартный набор метрик prometheus в Go -программе?
- Как встроить стандартный профайлер в свое приложение?
- Overhead от стандартного профайлера?
- Почему встраивание не наследование?
- Какие средства обобщенного программирования есть в Go?
- Какие технологические преимущества языка Go вы можете назвать?
- Какие технологические недостатки языка Go вы можете назвать?
- [Как сообщить компилятору, что наш тип реализует интерфейс?](docs/PODOLSKY.md#3)
- [Как работает append?](docs/PODOLSKY.md#4)
- [Какое у slice zero value? Какие операции над ним возможны?](docs/PODOLSKY.md#5)
- [Как устроен тип map?](docs/PODOLSKY.md#6)
- [Каков порядок перебора map?](docs/PODOLSKY.md#7)
- [Что будет, если читать из закрытого канала?](docs/PODOLSKY.md#8)
- [Что будет, если писать в закрытый канал?](docs/PODOLSKY.md#9)
- [Как вы отсортируете массив структур по алфавиту по полю Name?](docs/PODOLSKY.md#10)
- [Что такое сериализация? Зачем она нужна?](docs/PODOLSKY.md#11)
- [Сколько времени в минутах займет у вас написание процедуры обращения односвязного списка?](docs/PODOLSKY.md#12)
- [Где следует поместить описание интерфейса: в пакете с реализацией или в пакете, где этот интерфейс используется? Почему?](docs/PODOLSKY.md#13)
- [Предположим, ваша функция должна возвращать детализированные Recoverable и Fatal ошибки. Как это реализовано в пакете net? Как это надо делать в современном Go?](docs/PODOLSKY.md#14)
- [Главный недостаток стандартного логгера?](docs/PODOLSKY.md#15)
- [Есть ли для Go хороший orm? Ответ обоснуйте.](docs/PODOLSKY.md#16)
- [Какой у вас любимый линтер?](docs/PODOLSKY.md#17)
- [Можно ли использовать один и тот же буфер []byte в нескольких горутинах?](docs/PODOLSKY.md#18)
- [Какие типы мьютексов предоставляет stdlib?](docs/PODOLSKY.md#19)
- [Что такое lock-free структуры данных, и есть ли в Go такие?](docs/PODOLSKY.md#20)
- [Способы поиска проблем производительности на проде?](docs/PODOLSKY.md#21)
- [Стандартный набор метрик prometheus в Go -программе?](docs/PODOLSKY.md#22)
- [Как встроить стандартный профайлер в свое приложение?](docs/PODOLSKY.md#23)
- [Overhead от стандартного профайлера?](docs/PODOLSKY.md#24)
- [Почему встраивание не наследование?](docs/PODOLSKY.md#25)
- [Какие средства обобщенного программирования есть в Go?](docs/PODOLSKY.md#26)
- [Какие технологические преимущества языка Go вы можете назвать?](docs/PODOLSKY.md#27)
- [Какие технологические недостатки языка Go вы можете назвать?](docs/PODOLSKY.md#28)
10. [Популярные задачи на собеседованиях](docs/POPULAR_TASKS.md)
- [На вход подаются два неупорядоченных слайса любой длины. Надо написать функцию, которая возвращает их пересечение](docs/POPULAR_TASKS.md#1)
- [Написать генератор случайных чисел](docs/POPULAR_TASKS.md#2)
@@ -119,4 +118,4 @@
## Как мне добавить свой вопрос-ответ?
- [Ознакомтесь с шаблоном составления](TEMPLATE.md)
- [Ознакомьтесь с шаблоном составления](TEMPLATE.md)

View File

@@ -1,5 +1,23 @@
## <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. Как задать направление канала?
Мы можем задать направление передачи сообщений в канале, сделав его только отправляющим или принимающим. Например:
@@ -154,7 +172,7 @@ GC выполняется конкурентно (concurrent), одноврем
3. Идет перебор серых объектов, проверяются ссылки на другие объекты и помечаются на черные объекты. Если есть ссылка на белый объект, то белый становится серым.
4. Продолжается до тех пор, пока не будут перебраны все серые объекты.
5. Оставшиеся после перебора белые объекты считаются недостижимыми и занимаемая ими область памяти может быть освобождена.
Есть еще Мутатор - это приложение, работающее во время сборки мусора. Вызывает функцию барьера записи. Выполняется каждый раз, когда меняется указатель в куче. После изменения указателя объект считаеться достижимым и помечается как серый.
Есть еще Мутатор - это приложение, работающее во время сборки мусора. Вызывает функцию барьера записи. Выполняется каждый раз, когда меняется указатель в куче. После изменения указателя объект считается достижимым и помечается как серый.
### <a name="18"></a> 18.Что такое interface, как они работают в Go?
`// todo`

View File

@@ -9,4 +9,101 @@
### <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 вы можете назвать?