Добавление нового товара
Часть раздела Логика и управление потоком путешествия по GO на Coddy — урок 47 из 68.
Задание
ЛегкоРасширьте свою систему управления запасами, реализовав функциональность для безопасного добавления новых продуктов. Эта задача основана на предыдущей системе проверки запасов и добавляет возможность расширения вашего инвентаря, предотвращая при этом дублирование записей с помощью правильной обработки ошибок.
Вы получите два входных значения:
- Строка, содержащая данные о существующем инвентаре в формате
"product1:price1:quantity1,product2:price2:quantity2,product3:price3:quantity3"(например,"Laptop:999.99:5,Mouse:25.50:15,Keyboard:75.00:8") - Строка, содержащая новые продукты для добавления в формате
"product1:price1:quantity1,product2:price2:quantity2,product3:price3:quantity3"(например,"Monitor:299.99:10,Mouse:19.99:20,Webcam:89.99:12")
Ваша задача:
- Использовать ту же структуру
Productиз предыдущих уроков с полямиPrice(float64) иQuantity(int) - Разобрать первый ввод, разделив его по запятым, чтобы получить отдельные записи о существующих продуктах
- Для каждой записи о существующем продукте разделить ее по двоеточиям, чтобы получить название продукта, цену и количество
- Преобразовать строку цены в float64, а строку количества в int
- Создать и заполнить карту
inventoryданными о существующих продуктах - Создать функцию с названием
addNewItem, которая принимает карту инвентаря, название продукта, цену и количество в качестве параметров и возвращает ошибку:- Если продукт уже существует в инвентаре, вернуть ошибку с сообщением
"product already exists: [product_name]" - Если продукт не существует, добавить его в инвентарь и вернуть nil
- Если продукт уже существует в инвентаре, вернуть ошибку с сообщением
- Разобрать второй ввод, разделив его по запятым, чтобы получить список новых продуктов для добавления
- Для каждой записи о новом продукте разделить ее по двоеточиям, чтобы получить название продукта, цену и количество
- Преобразовать строку цены в float64, а строку количества в int
- Вывести заголовок процесса добавления:
"Adding New Items:" - Для каждого нового продукта вызвать функцию
addNewItemи вывести результаты:- Если нет ошибки:
"[product_name]: Successfully added - $[price] (Stock: [quantity])" - Если есть ошибка:
"[product_name]: Failed to add - [error_message]"
- Если нет ошибки:
- Подсчитать и вывести статистику добавления:
"Addition Summary:""Items processed: [total_number_of_items_processed]""Items added: [number_of_items_successfully_added]""Items rejected: [number_of_items_that_failed_to_add]"
- Вывести обновленный инвентарь в алфавитном порядке по названию продукта:
"Updated Inventory:"- Для каждого продукта:
"- [product_name]: $[price] (Stock: [quantity])"
- Рассчитать и вывести итоговую статистику инвентаря:
"Final Inventory Statistics:""Total Products: [total_number_of_products_in_inventory]""Total Items in Stock: [sum_of_all_quantities]""Total Inventory Value: $[sum_of_price_times_quantity_for_all_products]"
- Вывести список всех отклоненных продуктов:
- Если есть отклоненные продукты:
"Rejected products: [comma_separated_list_of_rejected_products]" - Если отклоненных продуктов нет:
"All new products were added successfully"
- Если есть отклоненные продукты:
Используйте пакет strings для разделения входных строк, пакет strconv для преобразования строк в числа, пакет errors для создания сообщений об ошибках, пакет fmt для форматированного вывода и пакет sort для сортировки названий продуктов по алфавиту. Форматируйте все цены до 2 знаков после запятой и общую стоимость инвентаря до 2 знаков после запятой. Эта задача демонстрирует, как безопасно расширять коллекции данных, предотвращая дублирование записей с помощью надлежащей обработки ошибок и валидации.
Попробуйте сами
package main
import (
"errors"
"fmt"
"strconv"
"strings"
)
type Product struct {
Price float64
Quantity int
}
func checkStock(inventory map[string]Product, productName string) (int, error) {
product, exists := inventory[productName]
if !exists {
return 0, errors.New("product not found: " + productName)
}
return product.Quantity, nil
}
func main() {
var inventoryData string
var checkRequests string
fmt.Scanln(&inventoryData)
fmt.Scanln(&checkRequests)
inventory := make(map[string]Product)
// Parse inventory data
productEntries := strings.Split(inventoryData, ",")
for _, entry := range productEntries {
parts := strings.Split(entry, ":")
name := parts[0]
price, _ := strconv.ParseFloat(parts[1], 64)
quantity, _ := strconv.Atoi(parts[2])
inventory[name] = Product{Price: price, Quantity: quantity}
}
// Parse check requests
productsToCheck := strings.Split(checkRequests, ",")
fmt.Println("Stock Check Results:")
var productsFound int
var productsNotFound int
var totalStock int
var missingProducts []string
for _, productName := range productsToCheck {
quantity, err := checkStock(inventory, productName)
if err != nil {
fmt.Printf("%s: Error - %s\n", productName, err.Error())
productsNotFound++
missingProducts = append(missingProducts, productName)
} else {
fmt.Printf("%s: %d units in stock\n", productName, quantity)
productsFound++
totalStock += quantity
}
}
fmt.Println("Check Summary:")
fmt.Printf("Products checked: %d\n", len(productsToCheck))
fmt.Printf("Products found: %d\n", productsFound)
fmt.Printf("Products not found: %d\n", productsNotFound)
fmt.Printf("Total stock for found products: %d units\n", totalStock)
if len(missingProducts) > 0 {
fmt.Printf("Missing products: %s\n", strings.Join(missingProducts, ","))
} else {
fmt.Println("All requested products are available")
}
}Все уроки раздела Логика и управление потоком
1Продвинутое управление потоком выполнения
Switch с использованием `fallthrough`Выход из вложенных цикловПродолжение конкретного циклаОператор `goto`Итоги: Продвинутое управление циклами4Проект: Простой список задач
Настройка проектаДобавление задачи2Структуры и методы
Определение методов для структурПолучатели по значениюПолучатели по указателюВыбор типа получателяМетоды против функцийИтоги: поведение структур5Карты: подробный разбор
Карты структурУказатели как значения картПроверка карт на nilСравнение картИтоги: счетчик частоты слов8Проект: Простой учет товаров
Обзор проектаПроверка остатков3Интерфейсы (Основы)
Что такое интерфейс?Определение интерфейсаРеализация интерфейсаИспользование интерфейсных типовПустой интерфейсУтверждение типаПереключатель типовИтоги: Фигуры и поведение