Простой HTTP-сервер на Go, демонстрирующий потокобезопасную работу с балансом с помощью атомарных операций (atomic.Int64).
Сервер обрабатывает два типа запросов: списание средств (платёж) и перевод денег в накопления (сберегательный счёт).
- POST /pay – выполнить платёж: списывает указанную сумму с основного баланса (
money), если достаточно средств. - POST /save – перевести средства в накопления: списывает сумму с
moneyи зачисляет её на сберегательный счёт (bank).
Все операции атомарны и безопасны для конкурентного доступа.
- Go 1.19+ (используется пакет
sync/atomic) - Стандартная библиотека (
net/http,io,strconv)
- Убедитесь, что установлен Go.
- Сохраните код в файл
main.go. - Запустите сервер:
go run main.go
- Сервер будет слушать порт
9091.
- Тело запроса: строка, содержащая сумму платежа (целое число).
- Логика: если
money >= сумма, тоmoney -= сумма. В противном случае возвращается сообщение об ошибке (только в лог). - Ответ: сервер не возвращает HTTP-ответа (только логи в консоль). В реальном проекте следует добавить ответ клиенту.
Пример запроса:
curl -X POST http://localhost:9091/pay -d "500"Лог:
The payment was successful: 500
- Тело запроса: строка с суммой для перевода в накопления.
- Логика: если
money >= сумма, тоmoney -= суммаиbank += сумма. - Ответ: только логи.
Пример запроса:
curl -X POST http://localhost:9091/save -d "200"Лог:
New variable value: 200
New variable value: 300
- Две глобальные переменные
moneyиbankобъявлены какatomic.Int64, что гарантирует атомарность операций чтения/изменения без использования мьютексов. - При старте
moneyинициализируется значением1000. - Каждый обработчик читает тело запроса целиком, преобразует его в число и выполняет соответствующую операцию с проверкой остатка.
- Все ошибки (чтение тела, преобразование числа) логируются, но не возвращаются клиенту (для учебного примера достаточно).
The program is running
The payment was successful: 500
New variable value: 200
New variable value: 300
There are not enough funds to make the payment!
- Код предназначен для образовательных целей и демонстрирует базовую работу с HTTP и атомарными операциями.
- В реальных проектах необходимо добавлять корректные HTTP-ответы (статусы, тело ответа) и более тщательную обработку ошибок.
- Для production-среды стоит рассмотреть использование контекстов, таймаутов и более продвинутые паттерны.
Берсиров Салим