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

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

Открыть в Telegram

Вопросы с собеседований по Go и ответы на них. Покажем, как запустить своего ии-агента: https://clc.to/tvpmD По рекламе: @proglib_adv Для обратной связи: @proglibrary_feeedback_bot Наши каналы: https://t.me/proglibrary/9197

Больше
7 429
Подписчики
-324 часа
-167 дней
+930 день
Архив постов
Что такое netip.Addr и в чём его преимущества перед net.IP netip.Addr — это тип из пакета net/netip, который представляет IP-адрес. Это современная замена net.IP. Основные различия Тип данных:
// net.IP - это срез байтов
type IP []byte

// netip.Addr - это структура с оптимизацией
type Addr struct {
    // Внутренняя реализация с компактным хранением
}
Размер в памяти:
import (
    "net"
    "net/netip"
)

// net.IP
var ip1 net.IP = net.ParseIP("192.168.1.1")
// Размер: от 4 до 16 байт (срез) + 24 байта (заголовок среза) = ~28-40 байт

// netip.Addr
var ip2 netip.Addr = netip.MustParseAddr("192.168.1.1")
// Размер: 16-17 байт (оптимизирован)
Преимущества netip.Addr Его можно сравнить, а значит использовать как ключ в мапе:
// net.IP нельзя использовать как ключ в map
var m map[net.IP]string // Ошибка компиляции!

// netip.Addr можно использовать как ключ
var m map[netip.Addr]string // OK
m[netip.MustParseAddr("192.168.1.1")] = "Gateway"
Меньший расход памяти:
// net.IP - неэффективно
ips := make([]net.IP, 1000)
for i := 0; i < 1000; i++ {
    ips[i] = net.ParseIP("192.168.1.1")
}
// Высокое потребление памяти из-за срезов

// netip.Addr - эффективно
addrs := make([]netip.Addr, 1000)
for i := 0; i < 1000; i++ {
    addrs[i] = netip.MustParseAddr("192.168.1.1")
}
// Компактное хранение
Удобный API:
addr := netip.MustParseAddr("192.168.1.1")

// Методы с хорошим интерфейсом
addr.Is4()                    // true
addr.Is6()                    // false
addr.IsPrivate()              // true
addr.IsLoopback()             // false
addr.IsUnspecified()          // false
addr.IsMulticast()            // false
addr.Unmap()                  // Для IPv4-mapped IPv6
addr.String()                 // "192.168.1.1"

// Работа с префиксами
prefix := netip.MustParseAddrPrefix("192.168.1.0/24")
prefix.Contains(addr)         // true
🎁 Новогодняя акция: 3 курса по цене 1 🤝 Помощь с выбором курса 🐸 Библиотека Go для собеса

Объясните, как работает директива //go:generate //go:generate — это директива препроцессора, которая указывает инструменту go generate на необходимость выполнить определённую команду для автоматической генерации кода. Директива должна находиться в начале файла после импортов, перед объявлениями:
package main

import "fmt"

//go:generate go run gen.go
//go:generate stringer -type=Status

type Status int

const (
    Pending Status = iota
    Active
    Done
)

func main() {
    fmt.Println("Hello")
}
🎁 Новогодняя акция: 3 курса по цене 1 🤝 Помощь с выбором курса 🐸 Библиотека Go для собеса

Что такое Dead Letter Queue Dead Letter Queue — это отдельная очередь для обработки сообщений, которые не могут быть успешно обработаны из основной очереди. Это механизм обработки ошибок в системах асинхронной обработки сообщений. Как это работает 1. Сообщение попадает в основную очередь. 2. Потребитель пытается его обработать. 3. Если обработка не удаётся, то сообщение может быть переотправлено. 4. После определённого количества неудачных попыток сообщение отправляется в DLQ. 5. DLQ хранит эти мёртвые сообщения для анализа и ручной обработки. 🎁 Новогодняя акция: 3 курса по цене 1 🤝 Помощь с выбором курса 🐸 Библиотека Go для собеса

Как вам вопросы прошедшей недели Оцените их по шкале 🔥,❤️,👍,😢, 🥱, где 🔥 — это супер, а 🥱 — это скучно. Также приветствуется фидбек в комментах. 🐸 Библиотека Go для собеса

Что произойдёт, если у структуры есть поле-канал или функция и вы попытаетесь его cмаршалить При попытке маршала канала в JSON возникнет ошибка:
type MyStruct struct {
    Ch chan int
}

data, err := json.Marshal(MyStruct{Ch: make(chan int)})
// error: json: unsupported type: chan int
Функции также не поддерживаются:
type MyStruct struct {
    Fn func(int) string
}

data, err := json.Marshal(MyStruct{Fn: func(i int) string { return "" }})
// error: json: unsupported type: func(int) string
🎁 Новогодняя акция: 3 курса по цене 1 🤝 Помощь с выбором курса 🐸 Библиотека Go для собеса

Как sync.Pool помогает снижать давление на GC sync.Pool снижает давление на GC, переиспользуя временные объекты между циклами сборки мусора вместо постоянных аллокаций новых. При Get() пул возвращает готовый объект или создаёт новый через New(). После использования Put() возвращает объект в локальный пул. 🎁 Новогодняя акция: 3 курса по цене 1 🤝 Помощь с выбором курса 🐸 Библиотека Go для собеса

Когда использовать debug.SetGCPercent debug.SetGCPercent используется для динамической настройки порога запуска сборщика мусора во время выполнения программы, в отличие от статической переменной GOGC. SetGCPercent(200) снижает частоту GC, но увеличивает память. SetGCPercent(50) запускает GC чаще с короткими паузами. SetGCPercent(-1) полностью отключает автоматическую сборку мусоры, это эквивалентно GOGC=off, память растёт без ограничений. 🎁 Новогодняя акция: 3 курса по цене 1 🤝 Помощь с выбором курса 🐸 Библиотека Go для собеса

WANTED: GO-ДОПРОСИТЕЛЬ Обвиняется в глубоком знании планировщика и умении объяснить работу каналов на пальцах. Пора перестать
WANTED: GO-ДОПРОСИТЕЛЬ Обвиняется в глубоком знании планировщика и умении объяснить работу каналов на пальцах. Пора перестать копить знания в приватных чатах — выходи на большую аудиторию. Приметы: — профессионально пишет на Golang (знает, чем он отличается от Java и Python); — понимает, что на самом деле спрашивают на интервью в бигтех-компаниях; — обладает талантом методиста и наставника; — готов монетизировать свой опыт через создание качественного контента. Условия: — статус эксперта в Proglib Academy; — достойная оплата за участие в проектах; — мощный PR твоего имени в IT-среде. Признаться во всём P.S. Твой техлид — Gopher со стажем? Сдай его следствию.

В чём разница между runtime.GC() и GOGC=off Функция runtime.GC() принудительно запускает цикл сборки мусора и блокирует вызывающий горутины до завершения. Она полезна для тестирования или в ситуациях, когда нужно немедленно освободить память, но не отключает автоматический GC — он продолжит работать по расписанию. Переменная окружения GOGC=off полностью отключает автоматический сборщик мусора, эквивалентно установке GOGC в бесконечность. GC не запускается сам, память растет без ограничений, что подходит для коротких задач или бенчмарков, но опасно для долгоживущих программ из-за риска исчерпания памяти. 🎁 Новогодняя акция: 3 курса по цене 1 🤝 Помощь с выбором курса 🐸 Библиотека Go для собеса

Есть ли гарантия порядка полей в результирующем JSON и нужно ли на него полагаться Порядок полей в JSON формально не гарантируется и полагаться на него не стоит. Для struct encoding/json на практике выводит поля в порядке, заданном в определении типа, но это деталь реализации, а не контракт, прописанный в спецификации JSON или строгом API пакета. Для мап порядок ключей в JSON принципиально не определён: обход мапы в Go сам по себе недетерминирован. 🎁 Новогодняя акция: 3 курса по цене 1 🤝 Помощь с выбором курса 🐸 Библиотека Go для собеса

Что произойдёт, если тип реализует MarshalJSON, но внутри MarshalJSON сделать рекурсивный вызов json.Marshal над самим собой без обёрток Если внутри MarshalJSON вызвать json.Marshal на значении того же типа без обёртки, получится бесконечная рекурсия и в итоге паника по переполнению стека. Как делать правильно Нужно маршалить не самого себя, а сырой тип без метода, например type alias или обёртку, либо вспомогательную структуру/тип, у которого нет MarshalJSON. Пример безопасного варианта:
type User struct {
    Name string
}

func (u User) MarshalJSON() ([]byte, error) {
    type plain User // alias без методов
    return json.Marshal(plain(u))
}
🎁 Новогодняя акция: 3 курса по цене 1 🤝 Помощь с выбором курса 🐸 Библиотека Go для собеса

Какие параметры принимает json.MarshalIndent, что означают prefix и indent json.MarshalIndent принимает те же данные, что и Marshal, плюс два строковых параметра prefix и indent, которые управляют только форматированием человекочитаемого JSON. prefix — строка, которая ставится в начале каждой строки JSON. Обычно пустая, иногда используют для логов. indent — строка для каждого уровня вложенности: например " " или "\t" Во всех случаях prefix и indent не влияют на порядок полей и значения, только на внешний вид текста JSON. 🎁 Новогодняя акция: 3 курса по цене 1 🤝 Помощь с выбором курса 🐸 Библиотека Go для собеса

ЭТОТ ПОСТ СПАСЕТ ТВОЙ 👩‍💻-СОБЕС В наше время очень тяжело попасть на собеседование! Поэтому предлагаем вам очень серьезно о
ЭТОТ ПОСТ СПАСЕТ ТВОЙ 👩‍💻-СОБЕС В наше время очень тяжело попасть на собеседование! Поэтому предлагаем вам очень серьезно относиться к ним. Не упускайте не единое собеседование, готовьтесь к каждому, как к последнему. Регулярно проверяйте свои hard-skills. Забирай чек-лист из закрепленного сообщения - 55 вопросов из реальных собесов! P.S. помимо непосредственно GO, разбираем другие необходимые технологии, про них нельзя забывать! Помни, что каждое собеседование в 2025 на вес золота! Реклама. Заимкин Святослав Валерьевич, ИНН 781430725000. Erid 2VtzqvB5FRL

Как вам вопросы прошедшей недели Оцените их по шкале 🔥,❤️,👍,😢, 🥱, где 🔥 — это супер, а 🥱 — это скучно. Также приветствуется фидбек в комментах. 🐸 Библиотека Go для собеса

Как реализовать собственный формат сериализации для типа и когда это нужно Собственный формат сериализации задаётся реализацией интерфейса json.Marshaler — то есть методом MarshalJSON() ([]byte, error) у типа. Это нужно, когда стандартное поведение encoding/json не подходит: особый формат даты, обёртка, маскирование. Пример:
func (t MyTime) MarshalJSON() ([]byte, error) {
  // хотим формат "YYYY|MM|DD"
  s := t.Format("2006|01|02")
  return json.Marshal(s)
}
🎁 Новогодняя акция: 3 курса по цене 1 🤝 Помощь с выбором курса 🐸 Библиотека Go для собеса

Влияет ли MarshalIndent только на форматирование, или может менять порядок полей/значения по сравнению с Marshal MarshalIndent влияет только на форматирование (пробелы, переводы строк, отступы). Порядок полей и сами значения он не меняет по сравнению с Marshal. 🎁 Новогодняя акция: 3 курса по цене 1 🤝 Помощь с выбором курса 🐸 Библиотека Go для собеса

Как маршалятся в JSON разные типы: string, int, float64, bool, slice, map, struct, nilБазовые типы • string → JSON-строка: "hello""hello". ​• int, uint, float64 и т.п. → JSON-число: 42, 3.14. ​• bool → JSON-логическое: true / false. — Срезы и массивы • slice/array → JSON-массив: []int{1, 2}[1,2]. ​• Срез строк → []string{"a", "b"}["a","b"]. — Мапыmap[string]T → JSON-объект: {"a":1}. Ключи должны быть строками, целыми числами или должны реализовать TextMarshaler. Для других типов ключей Marshal вернёт ошибку. — Структуры • struct → JSON-объект с полями: экспортируемые поля становятся полями JSON по имени или по тегу json:"...". Вложенные и embedded-структуры разворачиваются в соответствующие вложенные объекты/поля. ​ — nil • nil интерфейс, nil slice/map/pointer → JSON null, если само значение маршалится напрямую. При этом nil-срез кодируется как null, а не как [], если только вы отдельно не инициализируете его пустым. 🎁 Новогодняя акция: 3 курса по цене 1 🤝 Помощь с выбором курса 🐸 Библиотека Go для собеса

👣 Пишете на Go и хотите изучить HTTP? На открытом уроке 23 декабря в 20:00 МСК разберём, как работать с HTTP-клиентом и сервером: от простых GET-запросов до JSON-RPC. Покажем, как строить REST API с роутингом, контекстом, авторизацией, логированием и rate-limiting, а затем тестировать хендлеры через net/http/httptest. ❗️ Урок будет полезен Go-разработчикам, которые хотят уверенно писать продакшн-сервисы. Вы увидите связку стандартной библиотеки, middleware и подходов к оптимизации через пулы соединений и таймауты. ➡️ Встречаемся в преддверие старта курса «Golang Developer. Professional», регистрация открыта: https://clc.to/TxTARg 🎄 Учитесь в новом году по старым ценам! Максимальная скидка 30% на обучение до 21.12.2025: 1 курс — тающая скидка 15% до 21.12 2 курса −25%, 3 курса −30% Учиться системно — выгоднее! Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru

Как замаршалятся анонимные/встраиваемые структуры и поля с тегами, если в иерархии есть конфликт имён При маршалинге анонимные структуры разворачиваются в один общий JSON-объект, но при конфликте имён действует правило приоритета: явные теги выигрывают, при прочих равных побеждает поле из более внешнего уровня. Конфликт имён без тегов
type A struct {
    Name string
}
type B struct {
    Name string
}
type C struct {
    A
    B
}
У C два поля Name на одном уровне вложенности, и json.Marshal не сможет выбрать однозначно: такое поле считается конфликтным и пропускается. 🎁 Новогодняя акция: 3 курса по цене 1 🤝 Помощь с выбором курса 🐸 Библиотека Go для собеса

Как json.Marshal обрабатывает экспортируемые и неэкспортируемые поля структуры json.Marshal кодирует в JSON только экспортируемые поля структуры и игнорирует неэкспортируемые, даже если для них указаны теги. Теги json:"..." не делают поле видимым для json.Marshal, если оно неэкспортируемое. 🎁 Новогодняя акция: 3 курса по цене 1 🤝 Помощь с выбором курса 🐸 Библиотека Go для собеса