Golang вопросы собеседований
14.8K subscribers
770 photos
15 videos
1 file
559 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
Download Telegram
This media is not supported in your browser
VIEW IN TELEGRAM
👣 Golang: задача про слайсы и append: угадай вывод программы

Вот хитрая задача по Go - идеально, чтобы проверить, насколько хорошо ты понимаешь устройство слайсов, capacity и поведение append.
Подумай, что именно выведет программа и почему.


package main

import "fmt"

func main() {
a := []int{10, 20, 30, 40}
b := a[:2] // [10 20]
c := append(b, 99) // что происходит с a?
a[1] = 777 // влияет ли это на b и c?
c = append(c, 555) // а теперь?

fmt.Println("a:", a)
fmt.Println("b:", b)
fmt.Println("c:", c)
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥42
⚡️ CACHING STRATEGIES В СИСТЕМНОМ ДИЗАЙНЕ

Кэширование хранит часто используемые данные в быстром слое, обычно в памяти.
Это снижает нагрузку на базу данных и ускоряет ответы системы.
Один из самых эффективных способов улучшить производительность, масштабируемость и сократить расходы.

ПОЧЕМУ КЭШИРОВАНИЕ ВАЖНО
Экономит запросы к базе
Уменьшает задержку
Справляется с высоким количеством чтений
Укрепляет стабильность при нагрузках
Снижает стоимость инфраструктуры

1) CLIENT-SIDE CACHING
Хранение данных в браузере пользователя.
Используются cookies, localStorage, service workers.
Меньше повторных загрузок статических ресурсов.

2) CDN CACHING
Статические файлы лежат на глобальных edge-серверах.
CSS, JS, изображения, видео, шрифты.
Меньше задержка у глобальных пользователей и разгрузка основного сервера.

3) APPLICATION-LEVEL CACHING
Кэш внутри приложения.
Например, структуры в памяти вроде LRU cache.
Очень быстро, но работает в рамках одного сервера.

4) DISTRIBUTED CACHING
Общий кэш для множества серверов.
Инструменты: Redis, Memcached.
Подходит для горизонтального масштабирования и устраняет дублирование кэша.

5) DATABASE QUERY CACHING
Базы хранят результаты частых запросов.
MySQL Query Cache, Postgres внутренний кэш, MongoDB WiredTiger.
Ускоряет повторные чтения.

6) WRITE-BEHIND
Запись идет в кэш, а в базу — асинхронно.
Снижает задержку записи.
Подходит для систем с высокой нагрузкой на запись.

7) WRITE-THROUGH
Записи попадают в кэш и базу одновременно.
Гарантирует консистентность.
Немного медленнее из-за двойной записи.

8) CACHE-ASIDE
Приложение сначала проверяет кэш.
Если промах — идет в базу, затем помещает результат в кэш.
Гибкий и самый популярный вариант.

9) READ-THROUGH
Приложение всегда читает из кэша.
При промахе сам кэш получает данные из базы.
Кэш всегда остается обновленным.

10) TTL И ПОЛИТИКИ ИСТЕЧЕНИЯ
Каждая запись имеет срок жизни.
TTL, LRU, LFU, FIFO — разные режимы очистки данных.

11) INVALDATION
Ручное удаление ключей, удаление по шаблону, автоматическое истечение по TTL или лимиту памяти.

12) MULTI-LAYERED CACHING
Несколько уровней сразу: браузер, CDN, распределенный кэш, кэш приложения.
Полезно для глобальных систем с большим трафиком.

Совет
Кэширование помогает добиться высокой скорости, низкой нагрузки на базу и хорошей масштабируемости.
Стратегию нужно подбирать исходя из размеров системы, интенсивности запросов и требований к консистентности.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍111
Docker Volumes & Data Persistence

→ Контейнеры по умолчанию временные, их данные исчезают после остановки или удаления.
→ Docker даёт механизмы для постоянного хранения, чтобы данные переживали перезапуски.
→ Самый надёжный способ - использовать Docker volumes.

1. Почему важна устойчивость данных

→ Контейнеры часто пересоздаются при обновлениях и масштабировании.
→ Без персистентности пропадут логи, базы данных, загрузки пользователей, конфиги.
→ Docker volumes решают это, вынося данные за пределы файловой системы контейнера.

2. Варианты хранилищ в Docker

a) Volumes
→ Управляются Docker.
→ Хранятся в /var/lib/docker/volumes/.
→ Не зависят от контейнеров.
→ Лучший выбор для БД и долгоживущих данных.

b) Bind Mounts
→ Привязывают локальную директорию хоста к контейнеру.
→ Удобно в разработке.
→ Менее переносимые.

c) tmpfs Mounts
→ Данные только в памяти.
→ Очень быстрые, но непостоянные.
→ Для временных и чувствительных данных.

3. Что такое Docker Volume

→ Это область постоянного хранения, управляемая Docker.
→ Не удаляется при удалении контейнера.
→ Можно безопасно шарить между контейнерами.

Создать volume:

docker volume create mydata


Использовать:


docker run -v mydata:/app/data nginx


Посмотреть:

docker volume inspect mydata

4. Типы Volumes

a) Named Volumes
→ Создаются вручную.
→ Чистая изоляция от файлов системы хоста.
→ Лучший вариант для продакшена.

b) Anonymous Volumes
→ Без имени.
→ Могут удаляться вместе с контейнером.
→ Для временных задач.

5. Преимущества Docker Volumes

→ Данные переживают рестарты.
→ Легко бэкапить и переносить.
→ Работают при обновлении контейнеров.
→ Можно шарить между контейнерами.
→ Docker оптимизирует хранение под производительность.

6. Bind Mounts

→ Позволяют смонтировать директорию хоста:


docker run -v /host/path:/container/path myapp



→ Удобно в разработке (горячая перезагрузка кода).
→ В продакшене использовать аккуратно.

7. Persistency в Docker Compose

Compose автоматически управляет volumes.

Пример:

services:
db:
image: postgres
volumes:
- pgdata:/var/lib/postgresql/data

volumes:
pgdata:


→ База сохраняет данные между перезапусками.

8. Бэкап и восстановление Volumes

Бэкап:

docker run --rm -v mydata:/data -v $(pwd):/backup alpine tar czvf /backup/backup.tar.gz /data


Восстановление:

docker run --rm -v mydata:/data -v $(pwd):/backup alpine tar xzvf /backup/backup.tar.gz -C /


9. Как выбрать способ хранения

→ Volumes - лучший вариант для продакшена.
→ Bind mounts - для разработки.
→ tmpfs - для временных и быстрых операций.

Quick tip

→ Docker volumes - основа устойчивости данных.
→ Даёт гибкость, скорость и надёжность.
→ Незаменимы для баз данных, stateful-сервисов и реальных продакшен-приложений.```
👍11🔥1
🔍Тестовое собеседование с Go-разработчиком из Яндекса

11 декабря(уже в четверг!) в 19:00 по мск приходи онлайн на открытое собеседование, чтобы посмотреть на настоящее интервью на Middle Go-разработчика.

Как это будет:
📂 Владислав Кирпичов, Go-разработчик в Яндексе, ex-VK, будет задавать реальные вопросы и задачи разработчику-добровольцу
📂 Влад будет комментировать каждый ответ респондента, чтобы дать понять, чего от вас ожидает собеседующий на интервью
📂 В конце можно будет задать любой вопрос Владу

Это бесплатно. Эфир проходит в рамках менторской программы от ШОРТКАТ для Go-разработчиков, которые хотят повысить свой грейд, ЗП и прокачать скиллы.

Переходи в нашего бота, чтобы получить ссылку на эфир →
@shortcut_go_bot

Реклама.
О рекламодателе.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
This media is not supported in your browser
VIEW IN TELEGRAM
👣 GoLand 2025.3 вышел - и это обновление реально ускоряет жизнь Go-разработчиков.

Что добавили:

🔹 Анализ утечек ресурсов прямо в IDE - ошибки правятся на лету
🔹 ИИ-помощники: Junie и Claude Agent помогают писать и править код
🔹 Встроенная поддержка Terraform без плагинов
🔹 Удобный мониторинг Kubernetes-процессов

Подробности — jetbrains.com/go/whatsnew/
Please open Telegram to view this post
VIEW IN TELEGRAM
9🔥2🥰1
👣 gdu - быстрый консольный анализатор диска, написанный на Go.

Он сканирует директории и показывает, что именно съедает место, работая особенно шустро на SSD за счёт параллельной обработки. Есть TUI-интерфейс: можно стрелками ходить по каталогам, сортировать по размеру и удалять лишнее прямо из программы.

Установка максимально простая - есть готовые бинарники на GitHub, пакеты в репозиториях (AUR, Homebrew, Snap и др.), так что поставить и проверить свои диски можно за пару минут.

https://github.com/dundee/gdu
Please open Telegram to view this post
VIEW IN TELEGRAM
👍111🔥1
🔥 Новый курс на Stepik: Linux - апгрейд твоих скиллов до уровня инженера

Хватит быть “кликавшим по GUI”. Пора понимать систему изнутри.

Что освоишь:
• Bash, grep, sed, awk - инструменты взрослых админов
• Процессы, сеть, права, логирование и починка поломок
• SSH, firewall, systemd, cron, автозапуск сервисов

После курса: Linux перестаёт быть загадкой - ты будешь работать с ним уверенно.

40% скидка на 48 часов

👉 Начни учиться на Stepik.
👍2🔥2🥰2
🚀 Spreak - мощный и удобный инструмент для перевода в Go

Если вы пишете приложения на Go и хотите добавить поддержку нескольких языков - библиотека Spreak упрощает эту задачу.

🔹 Поддерживает gettext-совместимые каталоги
🔹 Работает с plural-формами и контекстом
🔹 Позволяет хранить переводы в файлах или embed'ить их в бинарь
🔹 Имеет удобный API для извлечения сообщений и форматирования

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

🔗 GitHub: https://github.com/vorlif/spreak
👍9🔥21
👣 Connective от x-sushant-x

Это инструмент для построения сервисов и взаимодействия между ними - что-то вроде Lego для распределённых приложений: подключай блоки, соединяй компоненты и получай рабочую систему.

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

Стоит посмотреть, если интересуешься микросервисами, event-driven системами или любишь копнуть архитектурные идеи руками.

github.com/x-sushant-x/Connective
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥31👍1😁1
Лёгкие и составные примитивы для надёжных синхронных и конкурентных конвейеров в Go

rop3 - это набор простых, но мощных строительных блоков для создания устойчивых конвейеров обработки данных в Go. Библиотека основана на паттерне Railway Oriented Programming, который помогает чётко моделировать последовательные и параллельные этапы обработки с удобной обработкой ошибок.

Вместо того чтобы плести сложные цепочки if err != nil, rop3 предлагает выразительные примитивы, которые легко комбинируются. Благодаря этому код становится чище и понятнее, а обработка ошибок и логика переходов перестаёт быть источником багов.

При этом поддерживается как синхронная, так и конкурентная обработка данных — всё это без тяжеловесных фреймворков и скрытой магии.

github.com/ib-77/rop3
🔥21👍1
This media is not supported in your browser
VIEW IN TELEGRAM
Полезная шпаргалка по консольным командам Git 👍

В Git полно команд, и если ты часто их забываешь, эта шпаргалка специально для тебя. В репозитории можно быстро почитать об основных командах и концепциях, а затем одним вальяжным нажатием на Ctrl+C скопировать их.

Приятный бонус — всё написано на русском. Так что сохраняем!

#git #шпаргалка
Please open Telegram to view this post
VIEW IN TELEGRAM
6👍3🥰2
Что выведет программа?

И объясни, почему вывод - НЕ тот, который ожидает большинство 🙂



package main

import "fmt"

func main() {
s := []int{1, 2, 3, 4}
t := s[:2] // [1 2]
u := s[2:] // [3 4]

// Изменяем через t
t = append(t, 9)

// Изменяем через u
u[0] = 99

fmt.Println("s:", s)
fmt.Println("t:", t)
fmt.Println("u:", u)
}


🔥 Разбор

t := s[:2] и u := s[2:] смотрят на один и тот же underlying array

но append(t, 9) может либо
• дописать в тот же массив, либо
• выделить новый, если capacity закончилась

Именно тут начинается путаница:

если capacity исходного s >= 5 — append изменит исходный массив, и s, t, u будут видеть изменения друг друга

если capacity = 4 — append создаст новый backing array, и t “оторвётся” от s и u

То есть вывод зависит от capacity, а её большинство разработчиков не проверяют, но предполагают.

✔️ Добавим интриги — сделай capacity явной 👇
s := make([]int, 4, 4) // capacity = length
copy(s, []int{1,2,3,4})


Теперь:

- append(t, 9) создаёт новый массив

и t уже не связан с s

Вывод будет:

```
s: [1 2 99 4]
t: [1 2 9]
u: [99 4]

```
Но если capacity увеличить:

```go
s := make([]int, 4, 10) // capacity > length
copy(s, []int{1,2,3,4})

```

Мы получим:


```
s: [1 2 9 99]
t: [1 2 9]
u: [99 4]

```

Потому что в этот раз append записал в тот же underlying array.


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


👉 Запустить код
🥱12👍6🥴32🔥2