使用go语言编写cli程序主要用到flag包,编程过程主要就三步,这里以编写一个显示当前日期的程序为例
// 显示当前时间 func showDate() { // 1. NewFlagSet 定义一个新的命令,在这里定义了一个显示日期的命令 showDateCmd := flag.NewFlagSet("showdate", flag.ExitOnError) // 2. Parse 函数用于解析参数列表的命令,该函数必须在定义FlagSet之后程序访问命令之前调用 err := showDateCmd.Parse(os.Args[2:]) if err != nil { log.Panic(err) } // 3. Parsed 函数用来判断是否调用了Parse方法 if showDateCmd.Parsed() { fmt.Println(time.Now()) } }
在这这三步中主要使用了三个方法NewFlagSet、Parse、Parsed。在这三步的基础上我们可以额外做一些事情,比如为一个命令添加一个参数,就像下面的程序一样,为calc命令添加了一个plus参数
// 加法 func calc() { sum := 0.0 calcCmd := flag.NewFlagSet("calc", flag.ExitOnError) // 为命令添加一个参数 calcPlus := calcCmd.String("plus", "", "两数相加") err := calcCmd.Parse(os.Args[2:]) if err != nil { log.Panic(err) } if calcCmd.Parsed() { if *calcPlus == "" { fmt.Println("参数列表错误") os.Exit(1) } if len(os.Args[:]) > 3 { for i := 3; i < len(os.Args[:]); i++ { f, err := strconv.ParseFloat(os.Args[i], 64) if err != nil { log.Panic(err) fmt.Println("应该输入数字") } else { sum += f } } } fmt.Printf("求和: %f", sum) } }
附录 完整程序及运行截图
package main import ( "flag" "fmt" "log" "os" "strconv" "time" ) // 显示当前时间 func showDate() { // NewFlagSet 定义一个新的命令,在这里定义了一个显示日期的命令 showDateCmd := flag.NewFlagSet("showdate", flag.ExitOnError) // Parse 函数用于解析参数列表的命令,该函数必须在定义FlagSet之后程序访问命令之前调用 err := showDateCmd.Parse(os.Args[2:]) if err != nil { log.Panic(err) } // Parsed 函数用来判断是否调用了Parse方法 if showDateCmd.Parsed() { fmt.Println(time.Now()) } } // 加法 func calc() { sum := 0.0 calcCmd := flag.NewFlagSet("calc", flag.ExitOnError) // 为命令添加一个参数 calcPlus := calcCmd.String("plus", "", "两数相加") err := calcCmd.Parse(os.Args[2:]) if err != nil { log.Panic(err) } if calcCmd.Parsed() { if *calcPlus == "" { fmt.Println("参数列表错误") os.Exit(1) } if len(os.Args[:]) > 3 { for i := 3; i < len(os.Args[:]); i++ { f, err := strconv.ParseFloat(os.Args[i], 64) if err != nil { log.Panic(err) fmt.Println("应该输入数字") } else { sum += f } } } fmt.Printf("求和: %f", sum) } } func run() { switch os.Args[1] { case "showdate": showDate() case "calc": calc() default: fmt.Println("命令不存在") os.Exit(0) } } func main() { run() }