Go语言学习笔记(十七)之命令行参数

时间:2022-05-01 14:32:52

24.1命令行参数

os.Args命令行参数的切片

  1: func main() {
  2: 	name := "Alice"
  3: 	fmt.Println("Good Morning", name)
  4: 	// 说明用户传入了参数
  5: 	if len(os.Args) > 1 {
  6: 		for index, v := range os.Args{
  7: 			if index != 0 { // index=0的命令行参数是文件路径
  8: 				// 打印每个参数
  9: 				fmt.Printf("args[%d]=%v\n", index, v)
 10: 			}
 11: 		}
 12: 	}
 13: }

使用flag包获取命令行参数

  1: var recusive bool
  2: var test string
  3: var level int
  4: 
  5: func init() {
  6: 	flag.BoolVar(&recusive, "r", false, "recusive xxx")
  7: 	flag.StringVar(&test, "t", "defalut string", "string option")
  8: 	flag.IntVar(&level, "l", 1, "level of xxxx")
  9: 	flag.Parse()
 10: }
 11: 
 12: func main()  {
 13: 	fmt.Printf("recusive:%v\n", recusive)
 14: 	fmt.Printf("test:%v\n", test)
 15: 	fmt.Printf("level:%v\n", level)
 16: }

终端运行

  1: test.exe -r -t hello -l 8888

运行结果

  1: recusive:true
  2: test:hello
  3: level:8888

24.2 cli框架

首先使用命令安装cli,go get github.com/urfave/cil

1.基本使用

Action里面的就是业务逻辑,自动封装了-help -version等方法

  1: package main
  2: import (
  3: 	"fmt"
  4: 	"github.com/urfave/cli"
  5: 	"log"
  6: 	"os"
  7: )
  8: func main() {
  9: 	app := cli.NewApp()
 10: 	app.Name = "boom"
 11: 	app.Usage = "make an explosive entrance"
 12: 	app.Action = func(c *cli.Context) error {
 13: 		fmt.Println("boom! I say!")
 14: 		return nil
 15: 	}
 16: 
 17: 	err := app.Run(os.Args)
 18: 	if err != nil {
 19: 		log.Fatal(err)
 20: 	}
 21: }

2.处理args第一个参数

比如输入参数alex,返回 hello "alex!"

  1: package main
  2: 
  3: import (
  4: 	"fmt"
  5: 	"github.com/urfave/cli"
  6: 	"log"
  7: 	"os"
  8: )
  9: 
 10: func main() {
 11: 	app := cli.NewApp()
 12: 
 13: 	app.Action = func(c *cli.Context) error {
 14: 		//获取第一个参数
 15: 		fmt.Printf("Hello %q", c.Args().Get(0))
 16: 		return nil
 17: 	}
 18: 
 19: 	err := app.Run(os.Args)
 20: 	if err != nil {
 21: 		log.Fatal(err)
 22: 	}
 23: }

3.Flag

  1: package main
  2: 
  3: import (
  4: 	"fmt"
  5: 	"github.com/urfave/cli"
  6: 	"log"
  7: 	"os"
  8: )
  9: 
 10: func main() {
 11: 	app := cli.NewApp()
 12: 
 13: 	app.Flags = []cli.Flag{
 14: 		cli.StringFlag{
 15: 			Name:  "lang",
 16: 			Value: "english",
 17: 			Usage: "language for the greeting",
 18: 		},
 19: 	}
 20: 
 21: 	app.Action = func(c *cli.Context) error {
 22: 		name := "Nefertiti"
 23: 		if c.NArg() > 0 {
 24: 			name = c.Args().Get(0)
 25: 		}
 26: 		if c.String("lang") == "spanish" {
 27: 			fmt.Println("Hola", name)
 28: 		} else {
 29: 			fmt.Println("Hello", name)
 30: 		}
 31: 		return nil
 32: 	}
 33: 
 34: 	err := app.Run(os.Args)
 35: 	if err != nil {
 36: 		log.Fatal(err)
 37: 	}
 38: }
  1: 输入参数alex -lang spanish
  2: 结果 Hello alex

4.关于commond和subcommand

通过定义这些,我们能实现类似可执行程序 命令 子命令的操作,比如 App.go add 123 控制台输出 added task:  123

  1: package main
  2: 
  3: import (
  4: 	"fmt"
  5: 	"log"
  6: 	"os"
  7: 	"github.com/urfave/cli"
  8: )
  9: 
 10: func main() {
 11: 	app := cli.NewApp()
 12: 
 13: 	app.Commands = []cli.Command{
 14: 		{
 15: 			Name:    "add",
 16: 			Aliases: []string{"a"},
 17: 			Usage:   "add a task to the list",
 18: 			Action: func(c *cli.Context) error {
 19: 				fmt.Println("added task: ", c.Args().First())
 20: 				return nil
 21: 			},
 22: 		},
 23: 		{
 24: 			Name:    "complete",
 25: 			Aliases: []string{"c"},
 26: 			Usage:   "complete a task on the list",
 27: 			Action: func(c *cli.Context) error {
 28: 				fmt.Println("completed task: ", c.Args().First())
 29: 				return nil
 30: 			},
 31: 		},
 32: 		{
 33: 			Name:    "template",
 34: 			Aliases: []string{"t"},
 35: 			Usage:   "options for task templates",
 36: 			Subcommands: []cli.Command{
 37: 				{
 38: 					Name:  "add",
 39: 					Usage: "add a new template",
 40: 					Action: func(c *cli.Context) error {
 41: 						fmt.Println("new task template: ", c.Args().First())
 42: 						return nil
 43: 					},
 44: 				},
 45: 				{
 46: 					Name:  "remove",
 47: 					Usage: "remove an existing template",
 48: 					Action: func(c *cli.Context) error {
 49: 						fmt.Println("removed task template: ", c.Args().First())
 50: 						return nil
 51: 					},
 52: 				},
 53: 			},
 54: 		},
 55: 	}
 56: 
 57: 	err := app.Run(os.Args)
 58: 	if err != nil {
 59: 		log.Fatal(err)
 60: 	}
 61: }
 62: 

类似MYSQL,FTP,TELNET等工具,很多控制台程序,都是进入类似一个自己的运行界面,这样其实CLI本身因为并没有中断,可以保存先前操作的信息。
所以,我们往往只需要用户登陆一次,就可以继续执行上传下载查询通讯等等的后续操作。

代码省略。