Библиотека Go для собеса | вопросы с собеседований
6.91K subscribers
251 photos
10 videos
1 file
589 links
Вопросы с собеседований по Go и ответы на них.

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

Учиться у нас: https://proglib.io/w/0b524a15

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

Наши каналы: https://xn--r1a.website/proglibrary/9197
Download Telegram
Как в Go отсортировать слайс структур без явной реализации sort.Interface

Для этого есть функции sort.Slice и sort.SliceStable, которые принимают любой слайс и функцию less с сигнатурой func(i, j int) bool. Внутри функции less можно описать логику сравнения элементов слайса по нужным полям.

🔹 Математика для Data Science
🔹 Получить консультацию менеджера
🔹 Сайт Академии 🔹 Сайт Proglib

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
Как с помощью пакета sort можно проверить, отсортирован ли произвольный слайс по своей кастомной less-функции

Для этого есть функция SliceIsSorted, которая принимает слайс и функцию less, аналогичную той, что используется в sort.Slice. Она возвращает true, если слайс уже отсортирован согласно переданному компаратору.

🔹 Практический интенсив «Архитектуры и шаблоны проектирования»
🔹 Получить консультацию менеджера
🔹 Сайт Академии 🔹 Сайт Proglib

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1🤩1
Напишите функцию сортировки массива без использования встроенных методов

Сортировка пузырьком:
package main

import "fmt"

func BubbleSort(nums []int) {
n := len(nums)
if n < 2 {
return
}

for i := 0; i < n; i++ {
swapped := false

for j := 0; j < n-1-i; j++ {
if nums[j] > nums[j+1] {
nums[j], nums[j+1] = nums[j+1], nums[j]
swapped = true
}
}

if !swapped {
break
}
}
}

func main() {
data := []int{5, 2, 6, 3, 1, 4}
BubbleSort(data)
fmt.Println(data)
}


🔹 Алгоритмы и структуры данных
🔹 Получить консультацию менеджера
🔹 Сайт Академии 🔹 Сайт Proglib

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
5👍1
В чём разница между t.Error(), t.Fail(), t.Fatal() и t.FailNow() в тестах

t.Error(), t.Fail(), t.Fatal() и t.FailNow() используются для обозначения неудачи теста, но различаются по поведению после вызова.

t.Fail() и t.Error() помечают тест как неудачный, но позволяют коду выполняться дальше, включая subtests через t.Run().
t.Error() дополнительно логирует сообщение об ошибке

t.FailNow() и t.Fatal() сначала вызывают Fail(), затем останавливают текущую горутину теста через runtime.Goexit(), выполняя все defer, но не прерывая другие горутины.

t.Fatal() логирует сообщение перед остановкой.

t.FailNow() вызывается только из горутины основного теста.

🔹 Основы IT для непрограммистов
🔹 Получить консультацию менеджера
🔹 Сайт Академии 🔹 Сайт Proglib

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥6
Go быстр, но математика быстрее

Можно бесконечно оптимизировать горутины, но если ваша ML-модель построена на кривой математике, перформанс не спасет. Мы перезапустили курс по матану для тех, кто хочет писать умный софт.

Живые вебинары уже идут. Что в меню:

1. Linear Algebra: разбираем свойства векторов, ранги матриц и операции над ними (база для любой нейронки);

2. Regression Analysis: строим линейную регрессию, разбираем МНК и учимся предсказывать значения;

3. SVD: реализуем сингулярное разложение для рекомендательных систем и сжатия данных.

Инструментарий — NumPy и scikit-learn , но логика применима везде.

Вход закрывается 9 декабря.

Запрыгивайте в последний вагон:
https://clc.to/LojFzw
Как поведёт себя go test, если в тестовой функции происходит panic, но не вызываются t.Error() или t.Fail()

go test помечает тест как FAILED и выводит информацию об ошибке.

Пример:
func TestPanic(t *testing.T) {
x := 5
y := 0
result := x / y // panic: runtime error: integer divide by zero
// t.Error() и t.Fail() НЕ вызывались
}


Вывод go test:
--- FAIL: TestPanic (0.00s)
panic: runtime error: integer divide by zero

goroutine 6 [running]:
testing.tRunner.func1()
/usr/lib/go-1.20/src/testing/testing.go:1526 +0x1c4
panic(...)
/usr/lib/go-1.20/src/runtime/panic.go:884 +0x212
main.TestPanic(...)
/path/to/test_test.go:10 +0x34
testing.tRunner(...)
/usr/lib/go-1.20/src/testing/testing.go:1526 +0x1a4

FAIL


🔹 Специалист по ИИ
🔹 Получить консультацию менеджера
🔹 Сайт Академии 🔹 Сайт Proglib

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Как вам вопросы прошедшей недели

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

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

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥104👍2
Расскажите подробнее про работу syncOnce

sync.Once в Go обеспечивает выполнение функции ровно один раз даже при конкурентных вызовах из множества горутин, используя атомарное поле done типа atomic.Bool и мьютекс.

При вызове Do(f) сначала проверяется o.done.Load() — если флаг true, метод сразу возвращается без выполнения f. Это оптимизировано для горячего пути: поле done размещено первым в структуре для минимизации инструкций на amd64/386. Неправильная реализация только с CompareAndSwap привела бы к гонке данных, где вторая горутина вернулась бы до завершения f первой.

Если done равно false, вызывается doSlow(f): захватывается мьютекс o.m.Lock(), повторно проверяется done, и только тогда выполняется f() с отложенной установкой o.done.Store(true). Это гарантирует, что f запустится ровно раз, а все последующие вызовы дождутся завершения. Если f паникует, Do считает задачу выполненной, и будущие вызовы пропускают её.

🔹 Основы IT для непрограммистов
🔹 Получить консультацию менеджера
🔹 Сайт Академии 🔹 Сайт Proglib

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
4😁1
Как ведёт себя select без case

В Go выражение select {} без блоков case — это бесконечная блокирующая операция. Это означает, что текущая горутина навсегда застрянет в ожидании какого-либо события, которого при этом нет.

Такой вызов часто используется для удержания основной горутины живой, чтобы программа не завершилась, например в серверных приложениях, где запущены другие горутины, и нужно, чтобы главный поток ждал их бесконечно:
func main() {
go doSomething()
select {}
}


🔹 Алгоритмы и структуры данных
🔹 Получить консультацию менеджера
🔹 Сайт Академии 🔹 Сайт Proglib

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔6👍32😁1
Какая разница между пустым select и пустым for

Это два способа создания бесконечного цикла, но они кардинально отличаются по поведению и потреблению ресурсов.

select {} — горутина блокируется навсегда, не потребляет CPU потому что горутина паркуется runtime'ом.

for {} — это бесконечный цикл, 100% CPU одного ядра потому что постоянно проверяет условие цикла.

🔹 Математика для Data Science
🔹 Получить консультацию менеджера
🔹 Сайт Академии 🔹 Сайт Proglib

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11
Зачем в появились errors.Is и errors.As, если уже есть сравнение err == someErr

errors.Is и errors.As нужны для корректной работы с обёрнутыми ошибками, когда err содержит не просто константу, а стек контекста.

Обычное сравнение err == someErr работает только если:

• err указывает ровно на ту же ошибку, что и someErr.

• ошибка не была обёрнута через fmt.Errorf("%w", err) или аналогичные механизмы.

Как только добавляется контекст fmt.Errorf("read config: %w", err), внешнее значение меняется, и == уже не срабатывает, хотя внутри всё ещё лежит исходная ошибка.

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
6
Что делает errors.Is

errors.Is разбирает цепочку обёрнутых ошибок и проверяет, эквивалентна ли какая‑то ошибка внутри этой цепочки целевой ошибке.

Функция errors.Is вызывает Unwrap у ошибки, если она его реализует и проходит по всей цепочке обёрток, пока не найдёт совпадение по ==, либо через метод Is, если он реализован у ошибки.

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2
Что делает errors.As

errors.As проходит по цепочке обёрнутых ошибок и пытается найти в ней значение, которое можно привести к заданному типу, записывая найденную ошибку в переданный указатель и возвращая true при успехе.

Функция вызывается как errors.As(err, &target), где target — указатель на переменную интерфейсного или конкретного типа ошибки, например, *os.PathError.

Внутри она разворачивает ошибку через Unwrap, проверяя каждое звено цепочки на возможность присваивания в target по правилу совместимости типов.

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
3🔥2
В чём разница между errors.Is и errors.As

errors.Is(err, target) — проверяет, встречается ли где‑то внутри обёрток ошибка target по значению.

errors.As(err, &target) — ищет внутри обёрток ошибку определённого типа и, если находит, кладёт её в target.

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
Как вам вопросы прошедшей недели

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

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

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥13👍43🥱2
Что делают json.Marshal и json.MarshalIndent, чем они отличаются

json.Marshal и json.MarshalIndent оба кодируют значение в JSON, но Marshal выдаёт компактный JSON в одну строку, а MarshalIndentчеловекочитаемый JSON с отступами и переводами строк.

🎁 Новогодняя акция: 3 курса по цене 1
🤝
Помощь с выбором курса

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9
Избегай Race Condition в карьере

Пока другие учат только синтаксис Go, ты можешь освоить архитектуру высоконагруженных систем. На собеседованиях в BigTech смотрят не на то, как ты пишешь if err != nil, а на то, как ты строишь взаимодействие сервисов.

Оффер 1 + 2:

Покупаешь один курс (основной), получаешь доступ к трем.

Мастхэв для гофера:

— Архитектуры и шаблоны проектирования;
— Алгоритмы и структуры данных.

Задеплоить знания

Таймаут: 31 декабря.
Ментор здесь: @manager_proglib
Как с помощью тегов json:"..." управлять именами полей, пропуском полей и именами с разным регистром при маршалинге

Теги json:"..." — это подсказки для пакетa encoding/json, как именно записывать поля структуры в JSON.

Без тегов Go сам придумывает имя поля в JSON из имени поля структуры: Name"Name", UserID"UserID".

Изменение имени поля:
type User struct {
Name string `json:"name"`
Email string `json:"email_address"`
}


Полностью скрыть поле («-»):
type User struct {
Name string `json:"name"`
Password string `json:"-"`
}


Password вообще не появится в JSON.

Пропускать пустые поля (omitempty):
type User struct {
Name string `json:"name"`
Email string `json:"email,omitempty"`
}


🎁 Новогодняя акция: 3 курса по цене 1
🤝
Помощь с выбором курса

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
6
Как json.Marshal обрабатывает экспортируемые и неэкспортируемые поля структуры

json.Marshal кодирует в JSON только экспортируемые поля структуры и игнорирует неэкспортируемые, даже если для них указаны теги.

Теги json:"..." не делают поле видимым для json.Marshal, если оно неэкспортируемое.

🎁 Новогодняя акция: 3 курса по цене 1
🤝
Помощь с выбором курса

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Как замаршалятся анонимные/встраиваемые структуры и поля с тегами, если в иерархии есть конфликт имён

При маршалинге анонимные структуры разворачиваются в один общий JSON-объект, но при конфликте имён действует правило приоритета: явные теги выигрывают, при прочих равных побеждает поле из более внешнего уровня.

Конфликт имён без тегов

type A struct {
Name string
}
type B struct {
Name string
}
type C struct {
A
B
}


У C два поля Name на одном уровне вложенности, и json.Marshal не сможет выбрать однозначно: такое поле считается конфликтным и пропускается.

🎁 Новогодняя акция: 3 курса по цене 1
🤝
Помощь с выбором курса

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM