Go · 43 строк
Сервис держит счета клиентов в памяти: карта заполняется при старте и дальше только читается. Transfer и Balance вызываются из горутин gRPC-сервера.
Отметьте строки с ошибками.
В работе: Быстрый контур переводов между своими счетами в мобильном банке.
Как проверяем
Нажмите на строку с ошибкой и коротко напишите, что не так. Баг засчитан, если отмечена хотя бы одна его строка. Зачёт — найдено не меньше 60 % багов с учётом серьёзности (критичный весит 3, обычный 2, мелкий 1), а лишних отметок не больше, чем багов в коде. Пустые строки, скобки и комментарии лишними не считаем. Плюс 1 вопрос про поведение программы — на зачёт не влияют. Ответ один на подход: после него показываем разбор.
Источник: на задачах Альфа-Банка: переводы между счетами. Условие пересказано своими словами.
Давали на собеседовании?
Ответов пока мало — ваш поможет.
package paymentsimport ("errors""sync")var ErrNoMoney = errors.New("недостаточно средств")type Account struct {mu sync.MutexID stringBalance int64 // копейки}// Available показывает остаток в мобильном приложении.func (a Account) Available() int64 {a.mu.Lock()defer a.mu.Unlock()return a.Balance}type Bank struct {accounts map[string]*Account // заполняется при старте, дальше только читается}func (b *Bank) Balance(id string) int64 {return b.accounts[id].Available()}func (b *Bank) Transfer(fromID, toID string, amount int64) error {from, to := b.accounts[fromID], b.accounts[toID]from.mu.Lock()to.mu.Lock()if from.Balance < amount {return ErrNoMoney}from.Balance -= amountto.Balance += amountto.mu.Unlock()from.mu.Unlock()return nil}