Golang вопросы собеседований
13.5K subscribers
631 photos
3 videos
1 file
433 links
@notxxx1 - админ

@Golang_google - Golang для разработчиков

@itchannels_telegram - 🔥лучшие из ит

@golangl - chat

@golangtests - golang tests

@golang_jobsgo - go chat jobs

@ai_machinelearning_big_data - AI

@data_analysis_ml

РКН: clck.ru/3FmtKd
加入频道
🔺Дизайн систем — основные понятия и принципы

CAP – Согласованность/целостность, доступность и устойчивость к разделению. Это означает, что версии одной и той же информации, хранящиеся на разных серверах, не противоречат друг другу и любой запрос к распределённой системе завершается корректным откликом. Такие системы возможны при поддержке ACID-требований к транзакциям

BASE — "в основном доступный, мягкое состояние, постепенно согласованный". Подход BASE ставит упор на доступность данных и их масштабируемость, позволяя достигнуть этих целей за счет компромисса в отношении согласованности данных.

SOLID — принцип единственной ответственности, принцип открытости/закрытости, принцип подстановки Барбары Лисков, принцип разделения интерфейса, принцип инверсии зависимостей

KISS — принцип, запрещающий использование более сложных средств, чем необходимо

И ещё некоторые важные требования к техническим системам в плане отказоустойчивости и т.д. на другом изображении

@golang_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
💡 Топ 150 задач c собеседований.

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

Задачи, которые покрывают 90% задач, структур данных, алгоритмов которые спрашивают на собеседованиях.

📂 Список

@golang_interview
👣 Полезная статья, где описываются методы оптимизации Go кода

Оптимизации включают использование map со значениями указателей, парсинг температур вручную и создание специальной хэш-таблицы.
Самое то для понимания, как работают высоконагруженные приложения, и как можно проводить их профилирование.

📎 Статья

@golang_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👣 Мышление программиста Go и скиллы управления кибер-инцидентами в борьбе с диабетом

Статья о человеке, которому Go помогает справляться с диабетом.
Если вкратце, то парень использует Go и распределённую систему микросервисов, чтобы отслеживать уровень инсулина и сахара в крови и т.д.
Параллельно в статье рассказывается про такие инструменты как Prometheus, Grafana, PagerDuty, так что можно узнать много полезного.

📎 Статья

@golang_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👣 Немного о записи в файл с помощью Go

В Go можно писать в файлы без использования буферов, что означает, что каждая операция записи в файл приводит к записи на диск. Это поведение отличается от многих других языков программирования, где операции ввода-вывода буферизуются по дефолту для улучшения производительности.
Если вы хотите использовать буферизованный ввод-вывод, вы должны явно использовать пакет bufio для создания буферизованных объектов чтения и записи.

В случае записи без использования буфера, каждый вызов WriteString приводит к непосредственной записи данных в файл, а с использованием буфера данные сначала записываются в него, и только после происходит запись данных в файл. Это может значительно улучшить производительность, особенно при большом количестве операций записи, поскольку уменьшает количество системных вызовов.

В общем, использование буферизованного ввода-вывода может быть более эффективным по сравнению с небуферизованным.
При работе с большими файлами и необходимости минимизировать использование памяти, может быть целесообразно рассмотреть использование bufio.Scanner, который также использует буферизацию, но с более низким потреблением памяти.

📎 Здесь обсуждение проблемы записи в файл на Go, примеры кода на Python и C, очень полезно

@golang_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👣 Как понять, что канал Go закрыт для записи?

Сразу перейдём к примеру. Закрытый канал не блокируется на чтение. Вот, тут довольно наглядно:
Loop:
for {
select {
case val, ok :=<- someChan:
if !ok {
// канал закрыт
break Loop
}
// получены данные, работа с val
default:
// канал пуст, что-то делать
}
}

Здесь, ok будет истиной только для открытого канала. Но при закрытии по каналу будут приходить пустые сообщения постоянно и ok будет ложью.

Однако вышеприведённая конструкция оптимальна только если нужно выполнять действие в default-ветке. Т.е. что-то делать, когда сообщений нет. Есть более простая и понятная конструкция
for val := range someChan {
// получено сообщение
}
// канал закрыт

В этом случае канал читается, используя for-range. Когда канал будет закрыт и из него будет прочитано последнее сообщение, произойдёт выход из цикла.


Запись

Запись в закрытый канал вызывает панику.
Дизайн приложения должен быть таким, что сторона создающая канал, его же и закрывает и пишет в него то же она. Более того, в этих случая рекомендуется, что б функция возвращала канал только для чтения
func run () <-chan string {
c := make(chan string)
// [...]
}



recover()

Конечно можно в отложенном вызове вызвать recover(), чтобы подавить панику. Но это в корне неправильно.

@golang_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
👣 Разрабы Go отвечают на вопросы

Среди заданных вопросов много интересных, типо:
— можно ли с Go и HTMX делать fullstack-приложения
— в чём отличие между namespace в других ЯП и package в Go
— как обстоят дела с Dependency Injection в Go
— и ещё несколько других

Отличное видео, помогает узнать об актуальных задачах, которые решаются с помощью Go и не только
Рекомендую)

📎 Youtube

@golang_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👣 Возможный вопрос на собесе: rune и byte — в чём разница?

rune - это 32-х битный тип, представляющий юникодные символы в кодировке UTF-32 aka UCS-4.

byte - это универсальный 8-битный тип.

rune используется для работы с не-ASCII символами в строках. Есть встроенное приведение []rune для типа string, которое парсит строку из UTF-8 (представление с переменной длиной байтов) в представление с фиксированной длиной байтов.

В случае не-ASCII строк разница между []byte(str) и []rune(str) разительна. Строка Привет, мир!:
Байты:  [208 159 209 128 208 184 208 178 208 181 209 130 44 32 208 188 208 184 209 128 33]
Руны: [1055 1088 1080 1074 1077 1090 44 32 1084 1080 1088 33]


Приведение []rune(string) эквивалентно вот такой функции:
func ToRunes(bytes []byte) []rune {
result := []rune{}
for i := 0; i < len(bytes); {
r, size := utf8.DecodeRune(bytes[i:])
result = append(result, r)
i += size
}
return result
}


📎На картинке текст программы с преобразованием Привет, мир! в руны и обратно

@golang_interview
Please open Telegram to view this post
VIEW IN TELEGRAM