Проверка остатков
Часть раздела Логика и управление потоком путешествия по GO на Coddy — урок 46 из 68.
Задание
ЛегкоРеализуйте функцию проверки запасов для вашей системы управления инвентарем, которая безопасно извлекает количество товаров и обрабатывает случаи, когда товары отсутствуют. Эта задача опирается на базу инвентаризации из предыдущего урока и добавляет обработку ошибок для запросов о наличии товара.
Вы получите два входных значения:
- Строку, содержащую данные о существующем инвентаре в формате
"product1:price1:quantity1,product2:price2:quantity2,product3:price3:quantity3"(например,"Laptop:999.99:5,Mouse:25.50:15,Keyboard:75.00:8") - Строку, содержащую запросы на проверку запасов в формате
"product1,product2,product3"(например,"Mouse,Tablet,Keyboard")
Ваша задача:
- Использовать ту же структуру
Productиз предыдущего урока с полямиPrice(float64) иQuantity(int) - Разобрать первый входной параметр, разделив его по запятым, чтобы получить записи об отдельных продуктах
- Для каждой записи о продукте разделить ее по двоеточиям, чтобы получить название продукта, цену и количество
- Преобразовать строку цены в float64, а строку количества в int
- Создать и заполнить карту (map)
inventoryполученными данными о продуктах - Создать функцию с именем
checkStock, которая принимает карту inventory и название продукта в качестве параметров и возвращает (int, error):- Если продукт существует в инвентаре, вернуть его количество и nil
- Если продукт не существует, вернуть 0 и ошибку с сообщением
"product not found: [product_name]"
- Разобрать второй входной параметр, разделив его по запятым, чтобы получить список продуктов для проверки
- Вывести заголовок проверки запасов:
"Stock Check Results:" - Для каждого продукта из списка проверки вызвать функцию
checkStockи вывести результаты:- Если ошибки нет:
"[product_name]: [quantity] units in stock" - Если есть ошибка:
"[product_name]: Error - [error_message]"
- Если ошибки нет:
- Подсчитать и вывести сводную статистику:
"Check Summary:""Products checked: [total_number_of_products_checked]""Products found: [number_of_products_that_exist]""Products not found: [number_of_products_that_dont_exist]"
- Вывести общий запас для найденных продуктов:
"Total stock for found products: [sum_of_quantities_for_existing_products] units"
- Перечислить все недостающие продукты:
- Если есть недостающие продукты:
"Missing products: [comma_separated_list_of_missing_products]" - Если недостающих продуктов нет:
"All requested products are available"
- Если есть недостающие продукты:
Используйте пакет strings для разделения входных строк, пакет strconv для преобразования строк в числа, пакет errors для создания сообщений об ошибках и пакет fmt для форматированного вывода. Эта задача демонстрирует, как реализовать безопасное извлечение данных с надлежащей обработкой ошибок — фундаментальный паттерн в системах управления запасами.
Попробуйте сами
package main
import (
"bufio"
"fmt"
"os"
"sort"
"strconv"
"strings"
)
// Define the Product struct
type Product struct {
Price float64
Quantity int
}
func main() {
// Read input using bufio.Scanner to handle spaces properly
scanner := bufio.NewScanner(os.Stdin)
scanner.Scan()
storeInfo := scanner.Text()
scanner.Scan()
productData := scanner.Text()
// 1. Parse store information (split by comma)
storeInfoParts := strings.Split(storeInfo, ",")
storeName := ""
location := ""
if len(storeInfoParts) >= 2 {
storeName = storeInfoParts[0]
location = storeInfoParts[1]
}
// 2. Parse product data (split by comma, then by colon for each product)
productEntries := strings.Split(productData, ",")
// 3. Create inventory map
inventory := make(map[string]Product)
// 4. Convert strings to appropriate types and populate inventory
for _, entry := range productEntries {
parts := strings.Split(entry, ":")
if len(parts) >= 3 {
productName := parts[0]
price, _ := strconv.ParseFloat(parts[1], 64)
quantity, _ := strconv.Atoi(parts[2])
inventory[productName] = Product{
Price: price,
Quantity: quantity,
}
}
}
// 5. Display store information
fmt.Printf("=== %s Inventory System ===\n", storeName)
fmt.Printf("Location: %s\n", location)
fmt.Printf("Inventory initialized with %d products\n", len(inventory))
// 6. Display current inventory (sorted alphabetically)
fmt.Println("Current Inventory:")
var productNames []string
for name := range inventory {
productNames = append(productNames, name)
}
sort.Strings(productNames)
for _, name := range productNames {
product := inventory[name]
fmt.Printf("- %s: $%.2f (Stock: %d)\n", name, product.Price, product.Quantity)
}
// 7. Calculate and display inventory statistics
totalProducts := len(inventory)
totalItems := 0
totalValue := 0.0
for _, product := range inventory {
totalItems += product.Quantity
totalValue += product.Price * float64(product.Quantity)
}
fmt.Println("Inventory Statistics:")
fmt.Printf("Total Products: %d\n", totalProducts)
fmt.Printf("Total Items in Stock: %d\n", totalItems)
fmt.Printf("Total Inventory Value: $%.2f\n", totalValue)
// 8. Display system status
fmt.Println("System Status: Ready")
fmt.Println("Inventory management system initialized successfully")
}Все уроки раздела Логика и управление потоком
1Продвинутое управление потоком выполнения
Switch с использованием `fallthrough`Выход из вложенных цикловПродолжение конкретного циклаОператор `goto`Итоги: Продвинутое управление циклами4Проект: Простой список задач
Настройка проектаДобавление задачи2Структуры и методы
Определение методов для структурПолучатели по значениюПолучатели по указателюВыбор типа получателяМетоды против функцийИтоги: поведение структур5Карты: подробный разбор
Карты структурУказатели как значения картПроверка карт на nilСравнение картИтоги: счетчик частоты слов8Проект: Простой учет товаров
Обзор проектаПроверка остатков3Интерфейсы (Основы)
Что такое интерфейс?Определение интерфейсаРеализация интерфейсаИспользование интерфейсных типовПустой интерфейсУтверждение типаПереключатель типовИтоги: Фигуры и поведение