Go: Декодирование артефакта из JSON — задача с проверкой
Практическая задача на Go по теме «Контракт переживает независимый выпуск». Условие содержит контракт функций, предоставленные типы и требования к результату. Используйте выданный шаблон и сохраняйте его публичные объявления. Перед проверкой разберите успешный путь, обработку ошибок и отмену операции, когда она предусмотрена контрактом. Здесь оценивается конкретный компонент сервиса; в полном курсе микросервисов на Go эти компоненты связываются с HTTP, PostgreSQL, gRPC и Kafka.
Декодирование артефакта из JSON
Представь, что твой сервис получает описание артефакта от внешнего API: один JSON-объект в байтовом срезе. Твоя задача — реализовать func DecodeArtifact(data []byte) (Artifact, error), которая разбирает эти байты и возвращает заполненный Artifact.
Тип Artifact уже предоставлен:
type Artifact struct {
ID string `json:"id"`
Checksum string `json:"checksum"`
SizeBytes int64 `json:"size_bytes"`
}
Реализуй только указанную функцию; писать main не нужно.
Структура имеет три обязательных поля: id и checksum — непустые строки, size_bytes — неотрицательное целое число int64 (ноль допустим). Обязательные ключи должны называться точно id, checksum и size_bytes. Если хотя бы один из них отсутствует, равен null или пришёл с неверным типом, функция должна вернуть нулевой Artifact и ненулевой error. Ключ ID не заменяет обязательный id: если есть только ID, поле id отсутствует и это ошибка. Если корректный id уже есть, дополнительный ID игнорируется, как и другие дополнительные ключи.
API иногда добавляет в ответ дополнительные ключи — например, необязательный signature. Их нужно молча игнорировать, не считая ошибкой. Зато невалидный JSON, корневое значение не-объектного типа или второй JSON-документ после первого — это ошибка.
Криптографически проверять контрольную сумму или подпись не нужно, HTTP-запросы делать не нужно — только разобрать уже готовые байты и проверить контракт.
Подсказки
- Декодирование в структуру допускает совпадение имён без учёта регистра. Подумай, как отдельно проверить точные имена ключей и отличить отсутствующее или null-значение от допустимого нуля.
json.Unmarshalразбирает весь переданный срез байтов: второй JSON-документ или неверный хвост после первого значения приведёт к ошибке. Один успешный вызовDecoder.Decodeсам по себе не подтверждает, что весь вход закончился.
Запуск на Latorn: редактируйте реализацию в полном шаблоне, сохраняя предоставленные объявления и публичный адаптер RunScenarios. main не требуется. Адаптер принимает массив сценариев и возвращает наблюдения; ожидаемые результаты сравниваются отдельно на сервере. Для собственного запуска аргументы — JSON-массив с одним массивом сценариев: [[...]].
Без регистрации. Гостевая проверка не сохраняет прогресс. Для сохранения перейдите к уроку.
Отправьте решение, чтобы увидеть результаты тестов.
Связанные задачи
- Go: Принять только полный ответ о последней статье — задача с проверкой
- HTTP-клиент поиска на Go: обработка ответа и ошибок — задача
- Go: Обязательная и необязательная зависимость при отказе — задача с проверкой
- Go: HTTP-обработчик поиска задания через JobStore — задача с проверкой
- Go: HTTP-обработчик расчёта калорийности состава — задача с проверкой
- Go: Контрактный тест обработчика и клиента питания — задача с проверкой
