Какой вывод получит консоль в примере №36

Сам фрагмент ничего не печатает. При последовательных вызовах Send выполняется на каждом сотом вызове Do; конкурентные вызовы создают гонку счётчика.

Короткий ответ

Что ответить на собеседовании

Сам фрагмент ничего не печатает. При последовательных вызовах Send выполняется на каждом сотом вызове Do; конкурентные вызовы создают гонку счётчика.

Подробный разбор

Ответ с пояснениями

Условие

Определите, что будет напечатано после выполнения программы и присутствуют ли в ней ошибки.

var counter int

type Trace struct {

}

type Sender interface {
    Send(Trace)
}

func Do(sender Sender, t Trace) {
    counter++
    if counter == 100 {
        sender.Send(t)
        counter = 0        
    }
}

Ответ

Сам фрагмент ничего не печатает. При последовательных вызовах Send выполняется на каждом сотом вызове Do; конкурентные вызовы создают гонку счётчика.

Без реализации Sender и вызовов Do точный консольный вывод определить нельзя. counter общий для всех sender: это не отдельный счётчик на получателя.

Для параллельной работы изменение счётчика и решение «нужно отправить» защищают одним mutex. Сам Send лучше выполнять вне блокировки, если не требуется строгий порядок отправок. Ошибка или паника отправки, её повтор и сохранение накопленного состояния требуют отдельной политики: текущий интерфейс Send даже не возвращает error.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее