Go語言基礎(十一)—— 實現命令列引數對資料的簡單查詢小案例
阿新 • • 發佈:2018-11-25
案例要求:
- 結合命令列引數、複合型別、包管理、排序等知識,寫一個商品管理系統
- 商品屬性包括:整型商品ID(gid)、字串型名稱(name)、整型類別(cid)、浮點型價格(price)
- 自己造一些假資料,實現如下功能:
- shop.exe -cmd single -gid xxx 檢視商品ID為gid的單品詳細資訊
- shop.exe -cmd category -cid xxx -order 0 檢視指定類別下的所有商品,cid=類別ID,order為排序規則
- 排序規則引數:0=按gid升序,1=按gid降序,2=按price升序,3=按price降序
package main import ( "flag" "fmt" ) type Product struct { name string Gid int Cid string Price float32 } var productmap = make(map[string][]Product) func main() { //製作一些假資料 var ( Fruit []Product = []Product{ {"apple", 1, "Fruit", 1.5}, {"pear", 2, "Fruit", 0.8}, {"Banana", 3, "Fruit", 0.9},} Tools []Product = []Product{ {"clippers", 4, "Tools", 5.0}, {"knife", 5, "Tools", 6.0}, {"pen", 6, "Tools", 1.0}, } ) //將假資料新增到map中,方便查詢 productmap["Fruit"] = Fruit productmap["Tools"] = Tools //獲取cmd命令引數 cid, gid, order := GetFlagArgs() if cid != nil && order != nil { var orderValue = *order //如果存在這個product則進行,如果不存在則出錯 if products, ok := productmap[*cid]; ok { Ordersort(orderValue, products) } else { fmt.Println("您輸入的cid引數不正確!") } } else if gid != nil { for _, products := range productmap { for _, product := range products { if *gid == product.Gid { fmt.Println(product) goto HERE } } } fmt.Println("您輸入的gid引數錯誤!") HERE: } else { fmt.Println("您沒有進行任何操作!") } } func GetFlagArgs() (cid *string, gid *int, order *int) { cmd := flag.String("cmd", "cmd", "命令列引數") cid = flag.String("cid", "cid", "整型類別") gid = flag.Int("gid", 0, "整型商品型別") order = flag.Int("order", 0, "商品排序規則") flag.Parse() if *cmd == "single" { return nil, gid, nil } else if *cmd == "category" { return cid, nil, order } else { fmt.Println("cmd沒有寫正確,請重寫") return nil, nil, nil } } func Ordersort(order int, products []Product) { switch order { case 0: for i := 0; i < len(products)-1; i++ { for j := i + 1; j < len(products); j++ { if products[i].Gid > products[j].Gid { products[i], products[j] = products[j], products[i] } } } case 1: for i := 0; i < len(products)-1; i++ { for j := i + 1; j < len(products); j++ { if products[i].Gid < products[j].Gid { products[i], products[j] = products[j], products[i] } } } case 2: for i := 0; i < len(products)-1; i++ { for j := i + 1; j < len(products); j++ { if products[i].Price > products[j].Price { products[i], products[j] = products[j], products[i] } } } case 3: for i := 0; i < len(products)-1; i++ { for j := i + 1; j < len(products); j++ { if products[i].Price < products[j].Price { products[i], products[j] = products[j], products[i] } } } default: fmt.Println("您輸入的order引數錯誤!") } for _, v := range products { fmt.Println(v) } }
結果演示:
編譯一下
執行命令 main.exe -cmd single -gid 3(查詢gid為3的product)
執行命令 main.exe -cmd single -gid 6(查詢gid為6的product)
並查詢一個不存在的gid看其是否顯示錯誤
輸入main.exe category -cid Frult -order 0 ,查詢cid為Frult 的products並將其按照gid升序排列
輸入main.exe category -cid Tools -order 1 ,查詢cid為Tools 的products並將其按照gid降序排列
輸入main.exe category -cid Tools -order 3 ,查詢cid為Tools 的products並將其按照price降序排列
故意將order引數寫錯,看其是否報錯。