TGViewer
Igor Panasyuk | IGORoutine Programming Igor Panasyuk | IGORoutine Programming @igoroutine · 2.22K subscribers
Post #111 2.29K

Forwarded from igoroutine.courses

😎😎 Убийственная задача с собеседования в UzumMarket

С каждым днём AI-инструменты обесценивают тривиальные знания и навыки. Никого уже не удивишь каналами, паттернами или устройством планировщика Go. Задачи становятся сложнее, требуются как знания нюансов языка, так и понимание базовых принципов. Всё это делается, чтобы отобрать максимально компетентных кандидатов среди огромного количества желающих.

Говоря про Go, почти каждое собеседование содержит задачи с concurrency. Пример одной из задач:

«Необходимо написать собственный sync.Once»


func (o *Once) Do(f func())


Проще говоря, если две горутины вызывают Do(f1) и Do(f2), по итогу только одна из функций должна выполниться, даже если f1 == f2.

Попробуем реализовать:

❗️STOP 😱😱😱
Здесь 97% кандидатов уже проиграли, даже не начав писать код. И не потому, что не знают sync.Once, а потому что не умеют задавать вопросы и уточнять требования. Ведь корректность реализации примитива синхронизации, прежде всего, зависит от его контракта. Смотрим, что дальше

Наивная реализация выглядит так:


if o.done.CompareAndSwap(0, 1) {
f()
}


Заходим в исходники Go и видим:

// Note: Here is an incorrect implementation of Do:
//
// if o.done.CompareAndSwap(0, 1) {
// f()
// }


Почему так? Потому что изначально контракт sync.Once предполагает, что:


In the terminology of the "Go memory model", the return from f "synchronizes before" the return from any call of once.Do(f).


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

Корректная реализация выглядит так:


...
if !o.done.Load() {
o.doSlow(f)
}
...

func (o *Once) doSlow(f func()) {
o.m.Lock()
defer o.m.Unlock()
if !o.done.Load() {
defer o.done.Store(true)
f()
}
}


Этим тонкостям на канале посвящено отдельное видео, там в том числе разбирается реализация sync.Once с примерами возникающих проблем. Более того, стала доступна запись выступления на GolangConf-X-2025, где подробно рассказывается про модель памяти.

Если же у тебя есть желание повысить свою компетентность, чтобы не попасть в те самые 97%, второй поток 🍀 The Nature of Concurrency начнётся уже на следующей неделе, успевай, пока ещё остались места
  • ❤ 21
  • 🤯 6
  • 😱 1
More from @igoroutine
  1. Sep 29, 2026Отправляешь очередной промпт нейронке и ловишь себя на мысли: «Я - какой-то ненастоящий пр…
  2. Jul 13, 2026Доброго вечера и хорошей недели)) На ней выйдут два новых видео. Рассвет сегодня не заснял…
  3. Jul 6, 2026Доброе утро и хорошей недели
  4. Jul 4, 2026AI заменит образование? В последнее время в индустрии очень остро стоит вопрос о смысле тр…
  5. Jul 1, 2026Без этих знаний твой Go-вайбкод положит прод | Пакет sync изнутри Давно обещал выпустить п…
  6. Jun 29, 2026Доброе утро и хорошей недели
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 →