1. 程式人生 > >Go語言基礎(十一)—— 實現命令列引數對資料的簡單查詢小案例

Go語言基礎(十一)—— 實現命令列引數對資料的簡單查詢小案例

案例要求:

  • 結合命令列引數、複合型別、包管理、排序等知識,寫一個商品管理系統
  • 商品屬性包括:整型商品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引數寫錯,看其是否報錯。