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


    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
    ", 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
    ", recusive)
    
     14: 	fmt.Printf("test:%v
    ", test)
    
     15: 	fmt.Printf("level:%v
    ", 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本身因为并没有中断,可以保存先前操作的信息。
    所以,我们往往只需要用户登陆一次,就可以继续执行上传下载查询通讯等等的后续操作。

    代码省略。

  • 相关阅读:
    TCL 双引号和花括号的区别
    在Vivado中调用ModelSim生成FSM的状态转移图
    基于配置文件的方式来配置AOP
    Spring MVC_Hello World
    重用切点表达式
    Spring MVC概述(2)
    Shiro_DelegatingFilterProxy
    Shiro-工作流程
    切面的优先级
    Shiro-集成Spring
  • 原文地址:https://www.cnblogs.com/haoqirui/p/10216354.html
Copyright © 2020-2023  润新知