Kiểm tra hàng tồn kho
Thuộc phần Logic và luồng điều khiển trong hành trình GO của Coddy. Bài học 46 trên 68.
Thử thách
DễTriển khai một hàm kiểm tra hàng tồn kho cho hệ thống quản lý hàng tồn kho của bạn, giúp lấy số lượng sản phẩm an toàn và xử lý trường hợp sản phẩm không tồn tại. Thử thách này tiếp nối nền tảng về hàng tồn kho trong bài học trước và bổ sung cách xử lý lỗi khi truy vấn hàng tồn kho.
Bạn sẽ nhận được hai đầu vào:
- Một chuỗi chứa dữ liệu hàng tồn kho hiện có theo định dạng
"product1:price1:quantity1,product2:price2:quantity2,product3:price3:quantity3"(ví dụ:"Laptop:999.99:5,Mouse:25.50:15,Keyboard:75.00:8") - Một chuỗi chứa các yêu cầu kiểm tra hàng tồn kho theo định dạng
"product1,product2,product3"(ví dụ:"Mouse,Tablet,Keyboard")
Nhiệm vụ của bạn là:
- Dùng lại struct
Producttừ bài học trước với các trườngPrice(float64) vàQuantity(int) - Phân tích đầu vào thứ nhất bằng cách tách chuỗi theo dấu phẩy để lấy từng mục sản phẩm
- Với mỗi mục sản phẩm, tách chuỗi theo dấu hai chấm để lấy tên sản phẩm, giá và số lượng
- Chuyển chuỗi giá thành float64 và chuỗi số lượng thành int
- Tạo và điền dữ liệu sản phẩm đã phân tích vào map
inventory - Tạo một hàm có tên
checkStock, nhận map hàng tồn kho và tên sản phẩm làm tham số, rồi trả về (int, error):- Nếu sản phẩm có trong hàng tồn kho, trả về số lượng của sản phẩm và nil
- Nếu sản phẩm không tồn tại, trả về 0 và một lỗi có thông báo
"product not found: [product_name]"
- Phân tích đầu vào thứ hai bằng cách tách chuỗi theo dấu phẩy để lấy danh sách sản phẩm cần kiểm tra
- Hiển thị tiêu đề kiểm tra hàng tồn kho:
"Stock Check Results:" - Với mỗi sản phẩm trong danh sách cần kiểm tra, gọi hàm
checkStockvà hiển thị kết quả:- Nếu không có lỗi:
"[product_name]: [quantity] units in stock" - Nếu có lỗi:
"[product_name]: Error - [error_message]"
- Nếu không có lỗi:
- Đếm và hiển thị các số liệu tổng kết:
"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]"
- Hiển thị tổng số lượng hàng tồn kho của các sản phẩm tìm thấy:
"Total stock for found products: [sum_of_quantities_for_existing_products] units"
- Liệt kê các sản phẩm còn thiếu:
- Nếu có sản phẩm còn thiếu:
"Missing products: [comma_separated_list_of_missing_products]" - Nếu không có sản phẩm nào còn thiếu:
"All requested products are available"
- Nếu có sản phẩm còn thiếu:
Dùng package strings để tách các chuỗi đầu vào, package strconv để chuyển chuỗi thành số, package errors để tạo thông báo lỗi và package fmt để định dạng đầu ra. Thử thách này minh họa cách triển khai việc lấy dữ liệu an toàn cùng với xử lý lỗi phù hợp, một mẫu cơ bản trong các hệ thống quản lý hàng tồn kho.
Tự làm thử
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")
}Tất cả bài học trong Logic và luồng điều khiển
1Luồng điều khiển nâng cao
Switch với `fallthrough`Thoát khỏi vòng lặp lồng nhauTiếp tục một vòng lặp cụ thểCâu lệnh `goto`Ôn tập: điều khiển vòng lặp nâng cao4Dự án: Danh sách việc cần làm đơn giản
Thiết lập dự ánThêm một việc cần làm2Struct và phương thức
Định nghĩa phương thức cho structReceiver giá trịReceiver con trỏChọn receiverPhương thức và hàmÔn tập: hành vi của struct5Tìm hiểu chuyên sâu về map
Map chứa structCon trỏ làm giá trị của mapKiểm tra map nilSo sánh các mapÔn tập: bộ đếm tần suất từ8Dự án: Quản lý hàng tồn kho đơn giản
Tổng quan dự ánKiểm tra hàng tồn kho3Interface (cơ bản)
Interface là gì?Định nghĩa interfaceTriển khai interfaceDùng kiểu interfaceInterface rỗngKhẳng định kiểuType switchÔn tập: hình dạng và hành viTự luyện tập: Trình biên dịch Go online