TGViewer
Channel Public Channel
Библиотека Go для собеса | вопросы с собеседований

Библиотека Go для собеса | вопросы с собеседований

@go_interview_lib

Вопросы с собеседований по Go и ответы на них.

Учиться у нас: clc.to/iEeaZw

По рекламе: @tproger_sales_bot

Для обратной связи: @proglibrary_feeedback_bot

Наши каналы: https://t.me/proglibrary/9197
Subscribers
7.46K
Photos
286
Videos
12
Links
874

Showing posts older than #1363 · Back to latest

Older Posts 20 shown
Post #1362 1.71K
Как использовать context в юнит-тестах

t.Context() — основной способ (Go 1.24+):
func TestFetch(t *testing.T) {
result, err := Fetch(t.Context(), "https://example.com")
// ...
}


Контекст автоматически отменяется при завершении теста, в том числе по go test -timeout. Не нужен ни defer cancel(), ни ручной WithTimeout.

Явный таймаут — когда тестируете временно́е поведение:
ctx, cancel := context.WithTimeout(t.Context(), 500*time.Millisecond)
defer cancel()


Базовый контекст — t.Context(), не context.Background(). Так контекст остаётся привязан к жизненному циклу теста.

🐸 Библиотека Go для собеса
  • 👍 5
Post #1361 1.57K
🔥 Знакомьтесь с экспертом Proglib.academy: Эмиль Сатаев

Эмиль — эксперт с 8-летним опытом в разработке, который специализируется на внедрении LLM и агентных подходов в реальные коммерческие сервисы. Он точно знает, как проектировать архитектуру так, чтобы ИИ-функции работали стабильно в связке с внешними системами.

🏃‍♀️ Уже 14 мая Эмиль проведет открытый вебинар!

Обсудим самую «больную» тему: «Почему AI-продукты на базе LLM ломаются и как сделать, чтобы работало».

🗓 Когда: 14 мая в 19:00 (Мск)

Почему Эмиля стоит послушать:

🟣 8+ лет в разработке (Backend и Frontend)
Прошел путь от фулстека до Backend Platform Developer в SMIT.Studio.


🟣 Международный исследовательский опыт
Работал исследователем в Институте ИИ НИУ ВШЭ и в Национальном университете Сингапура (NUS).


🟣 Преподаватель-практик
Ведет семинары в НИУ ВШЭ, в том числе по проектированию и разработке агентских систем.


🟣 Мастер интеграции AI в Backend
Его главная суперсила — умение правильно встраивать LLM через API, выстраивать workflow и агентную логику в сложных распределенных системах.


🔗 Зарегистрироваться на вебинар
  • 😁 1
Post #1360 1.49K
Что изменилось в функции new в go 1.26

Теперь в качестве аргумента можно передавать не только тип, но и выражение с начальным значением.

p := new(42) // *p == 42


Если аргумент expr имеет тип T, то new(expr) выделяет переменную типа T, инициализирует её значением expr и возвращает указатель типа *T.

🐸 Библиотека Go для собеса
  • 😁 4
  • 👍 1
Post #1358 1.54K
Какое обязательное требование к срезу для slices.BinarySearch
 
Срез должен быть отсортирован по возрастанию — иначе результат непредсказуем.
 
names := []string{"Alice", "Bob", "Vera"}
n, found := slices.BinarySearch(names, "Bill")
// n=1, found=false — позиция, куда нужно вставить "Bill"
 
n, found = slices.BinarySearch(names, "Vera")
// n=2, found=true


🐸 Библиотека Go для собеса
  • 👍 4
  • 😁 2
Post #1357 1.53K
Как вам вопросы этой недели

Оцените их по шкале 🔥,❤️,👍,😢, 🥱,
где 🔥 — это супер, а 🥱 — это скучно.

Также приветствуется фидбек в комментариях.

🐸 Библиотека Go для собеса
  • ❤ 8
  • 🔥 7
  • 👍 3
  • 🥱 1
  • 👾 1
Post #1356 1.66K
🗓 14 мая в 19:00 (Мск) встречаемся в онлайне.

Тема: Почему AI-продукты на базе LLM ломаются и как сделать, чтобы работало.

В кружке выше Эмиль Сатаев рассказал, какие именно проблемы с LLM в проде будем разбирать.

Что в программе:
- Разберем реальные кейсы стартапов и ограничения LLM.
- Обсудим рабочие архитектуры: RAG, human-in-the-loop, контроль качества.
- Ответим на ваши вопросы и разберем кейсы участников.


🎁 Бонусы: в конце вебинара подарим промокод на скидку 10.000 ₽ на курсы и разыграем подписки на полезные AI-сервисы.

👉 Зарегистрироваться на вебинар
Post #1354 1.74K
Что делает slices.Compact

slices.Compact удаляет подряд идущие дубликаты, то есть оставляет только первый элемент из каждой группы одинаковых соседних значений.

s := []int{1, 1, 2, 3, 3, 3, 4, 1, 1}
s = slices.Compact(s)
// [1 2 3 4 1]


Compact работает in-place и возвращает подсрез того же массива — лишние элементы в хвосте не обнуляются, просто укорачивается длина.

🐸 Библиотека Go для собеса
  • 👍 7
Post #1353 1.65K
Как разбить массив, если могут быть несколько разделителей подряд

FieldsFunc пропускает любое количество подряд идущих разделителей и не создаёт пустых элементов между ними — в отличие от Split, который создаёт пустую строку на каждый лишний разделитель:
data := []byte("foo,,bar,,,baz")

parts := bytes.FieldsFunc(data, func(r rune) bool {
return r == ','
})

// ["foo" "bar" "baz"]

bytes.Split([]byte("foo,,bar"), []byte(","))
// ["foo" "" "bar"] — пустой элемент между двумя запятыми


🐸 Библиотека Go для собеса
  • 🔥 13
Post #1352 1.58K
Как обработать сразу несколько ошибок

До версии 1.20 ошибки обрабатывались поочерёдно. Начиная с 1.20 появилась возможность объединить несколько ошибок в одну агрегированную с помощью errors.Join.

err = errors.Join(function1(), function2())

if err != nil {
fmt.Println(err)
// выведет все ошибки через \n



errors.Join возвращает nil, если все переданные ошибки равны nil. Иначе он возвращает составную ошибку, которую можно раскрыть через errors.Unwrap.

🐸 Библиотека Go для собеса
  • 👍 6
  • ❤ 4
Post #1351 1.66K
🦾 Почему ваши AI-продукты на базе LLM ломаются (и как это чинить)?

Выкатили ИИ-фичу в прод, а она галлюцинирует, падает или выдает мусор? Приглашаем на открытый вебинар, где разберем реальную боль внедрения LLM-агентов и научимся делать так, чтобы «всё работало».

🗓 Когда: 14 мая в 19:00 МСК
⏱️ Формат: 60 минут мяса + 30 минут ответов на ваши вопросы

🧑🏻‍💻 Кто вещает: Эмиль Сатаев — Backend Platform Developer (8+ лет в разработке). Человек, который своими руками внедряет LLM и агентные системы в реальные коммерческие сервисы.

🎁 Главный бонус для онлайна:
Только участникам прямого эфира подарим уникальный промокод на скидку 10.000 ₽ на большой курс AgentOps.

👉 Занять место на вебинаре
  • ❤ 1
Post #1350 1.56K
Как в Go организован доступ к системным вызовам операционной системы

В Go можно напрямую обращаться к системным вызовам ОС. Для этого существует пакет syscall из стандартной библиотеки, а также более современный пакет golang.org/x/sys/unix или windows. Они предоставляют низкоуровневый интерфейс к вызовам ядра — например, можно вызвать syscall.Open, syscall.Read, syscall.Write или напрямую использовать syscall.Syscall(SYS_READ, ...), передавая номер системного вызова и аргументы.

На практике прямое использование syscall встречается редко, потому что стандартная библиотека Go уже абстрагирует большинство системных взаимодействий через пакеты os, net, io и другие. Под капотом именно они и вызывают соответствующие syscall'ы. Прямой доступ обычно нужен в специфичных сценариях — например, при работе с epoll, ptrace, seccomp, установке флагов дескрипторов или при написании системных утилит, где нужна максимальная гибкость без лишних обёрток.

🐸 Библиотека Go для собеса
  • 👍 2
Post #1349 1.53K
Как поддерживать старый и новый функционал одновременно

Паттерн Strangler Fig позволяет постепенно заменять старую систему новой, не останавливая работу продукта. Новый функционал «обволакивает» старый как фикус обволакивает дерево-хозяина и со временем полностью его вытесняет.

Можно реализовать через фасадную-прослойку: она перехватывает запросы и решает куда направить вызов: в legacy-код или в новый сервис.

Переключение идёт через фича флаги, фича за фичей, пока старый код не становится ненужным и его можно удалить.

🐸Библиотека Go для собеса
  • 👍 1
Post #1347 1.68K
Какой максимальный размер бинарного файла можно собрать

В Go нет встроенного ограничения на размер бинарника. Теоретический предел это ресурсы машины, на которой идёт компиляция: свободное место на диске и доступная память.

Размер бинарника растёт из-за нескольких вещей:

Статическая линковка. Go по умолчанию собирает всё в один файл — рантайм, стандартная библиотека, все зависимости. Никаких внешних .so или .dll. Это удобно при деплое, но увеличивает размер даже у простой программы.

Встроенные ресурсы. Через //go:embed можно упаковать в бинарник статику, шаблоны, миграции. Добавили папку с фронтендом — бинарник вырос на её размер.

Отладочная информация. По умолчанию Go включает в бинарник DWARF-символы и таблицы имён. Это нужно для профилировщика и стектрейсов, но добавляет вес.

Если размер важен, его можно уменьшить флагами линковщика:
go build -ldflags="-s -w" -o app .


-s убирает таблицу символов, -w отключает DWARF. Бинарник становится меньше на 20–30%, но отладка по нему будет затруднена.

Дополнительно можно прогнать через upx — утилита сжимает исполняемый файл, он распаковывается уже в памяти при запуске.

🐸Библиотека Go для собеса
  • 🔥 6
  • ❤ 2
Post #1346 1.56K
Чем отличаются require, replace и exclude в go.mod

require фиксирует модуль и его версию. Без этой записи Go не знает, что подключать. При запуске go mod tidy строки require обновляются автоматически.
require github.com/some/pkg v1.2.3


replace подменяет источник модуля. Можно указать форк, другую версию или локальный путь. Чаще всего используют при локальной разработке — когда нужно протестировать изменения в зависимости, не публикуя их.
replace github.com/some/pkg => ../local/pkg


exclude запрещает использовать конкретную версию при разрешении зависимостей. Модуль не удаляется, но если что-то в дереве зависимостей попытается подтянуть именно эту версию — Go её проигнорирует и выберет другую. Применяют, когда версия содержит баг или уязвимость.
exclude github.com/some/pkg v1.2.3


🐸Библиотека Go для собеса
  • 👍 7
  • ❤ 2
Post #1345 1.5K
❓ Какая сложность по времени у доступа к элементам слайса

Go обращается по индексу к соответствующему элементу в массиве, на который ссылается слайс.

Доступ к элементу слайса константный по времени О(1).


🐸Библиотека Go для собеса
  • ❤ 5
Post #1344 1.7K
Чем отличается %v от %#v в fmt.Printf

%v — выводит значение в формате по умолчанию.

%#v — выводит значение в Go-синтаксисе. Представление, которое можно вставить в код как литерал.

type User struct {
Name string
Age int
}

u := User{"Alice", 30}

fmt.Printf("%v\n", u) // {Alice 30}
fmt.Printf("%#v\n", u) // main.User{Name:"Alice", Age:30}


🐸Библиотека Go для собеса
  • 👍 18
Post #1343 1.92K
Насколько безопасно передавать слайсы в горутины

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

append может вызвать реаллокацию: старый массив заменяется новым, и другие горутины продолжат работать с устаревшим указателем

Передача слайса по значению копирует только заголовок , но не данные — горутины всё равно разделяют память

Что делать:

sync.Mutex / sync.RWMutex — если нужен общий доступ с защитой

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

• sync.Map или разбиение на независимые диапазоны, если горутины работают с непересекающимися частями

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

🐸Библиотека Go для собеса
  • ❤ 2
Post #1342 1.92K
Как можно сделать разреженный массив

Вместо того чтобы перечислять значения, достаточно указать только значимые позиции.

Нужно в литерале массив указать индекс элемента явно через индекс: значение. Все значения, что не будут указаны заполнятся дефолтными значениями.

Пример:
var x = [12]int{1, 5: 4, 6, 10: 100, 15}


🐸Библиотека Go для собеса
  • 👍 13
  • ❤ 2
Older posts →
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →