TGViewer
igoroutine.courses igoroutine.courses @igoroutine_courses · 239 subscribers
Post #33 2.76K
😎😎 Убийственная задача с собеседования в 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 начнётся уже на следующей неделе, успевай, пока ещё остались места
  • 😱 2
More from @igoroutine_courses
  1. Jun 25, 2026Разбор задачи с порядком вызова функций в select Что будет выведено в stdout после запуска…
  2. Jun 24, 2026Post #40
  3. Jun 24, 2026photo post
  4. Mar 24, 2026😎😎 Это изменение сломало set на map[key]struct{}, который мы знали Продолжение предыдуще…
  5. Mar 23, 2026😎😎 Это изменение сломало Set на map[key]struct{}, который мы знали В Go все привыкли пис…
  6. Mar 5, 2026😎😎 От этого data race не спасает даже race detector Продолжение к предыдущему посту. Ита…
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 →