Go - flag:命令行flags解析

    科技2023-11-11  71

    Day Day GO

    flag作为go的基础模块,属于必知必会的常用模块,flag实现命令行flag解析,比如ls -l中的-l,当然golang内置的flag也可以实现类似docker ps -a中的ps -a这样子命令的效果,今天简短描述下go的flag模块该如何使用

    实现简单的flag解析

    golang的flag模块包含一些类型约束的方法,分为两种方式注册不同类型的flag,带有Var的函数其返回flag的值保存到p指向的变量,而不带Var的函数其返回的是保存该flag值的指针

    image-20201006124642590

    通过简单的案例说明:

    package main import (     "flag"     "fmt" ) func main() {     wordPtr := flag.String("word", "foo", "a string")     numbPtr := flag.Int("numb", 42, "an int")     boolPtr := flag.Bool("fork", false, "a bool")     var svar string     flag.StringVar(&svar, "svar", "bar", "a string var") // 对变量取址     flag.Parse()     fmt.Println("word:", *wordPtr)     fmt.Println("numb:", *numbPtr) // 对指针取值     fmt.Println("fork:", *boolPtr)     fmt.Println("svar:", svar)     fmt.Println("tail:", flag.Args()) }

    代码运行结果

    [Done] exited with code=0 in 0.84 seconds [Running] go run "/Users/marionxue/Documents/devopsnotes/workspace/code.devopsman.cn/go-programming/demo/main.go" word: foo numb: 42 fork: false svar: bar tail: []

    下面我们查看flag模块帮我们做的事情打印帮助信息、自动提示错误flag

    image-20201006130025008

    对于flag不同函数的使用,可以在https://studygolang.com/pkgdoc处获取详细的解释说明。

    实现子命令flag

    flag模块是通过NewFlagSet实现一个自定义的子命令选项,然后通过传递给NewFlagSet函数一个subcommandName和ErrorHandling来创建一个flagset对象,我们可以结合os模块与flag模块实现带有子命令选项的程序:

    判断程序选项参数的个数,然后通过swich-case去截取属于子命令的选项参数

    package main import (  "flag"  "fmt"  "os" ) func main(){  foostr := flag.NewFlagSet("str",flag.ExitOnError)  strValue := foostr.String("a","string","打印字符串")  intValue := foostr.Int("b",1,"打印数值")  if len(os.Args)<1{   fmt.Println("expected 'str' subcommands")   os.Exit(1)  }  switch os.Args[1]{  case "str":   foostr.Parse(os.Args[2:])   fmt.Println("a", *strValue)   fmt.Println("b", *intValue)  default:   fmt.Println("expected 'str' subcommands")   os.Exit(1)    } }

    如上代码,我们创建一个str的子命令对象,然后给予该str子命令两个flag分别是a和b,然后通过os模块判断选项参数是否合法,通过switch结构解析str子命令后的所有flag,查看代码运行结果

    image-20201006131205880

    flag模块自动完成了帮助信息的生成,方便使用者查看帮助信息,以上就是golang的flag模块的简单认识。

    同时在大型项目中,很多都是使用corba快速构建CLI程序,功能强大,使用便捷例如kubernetes, Hugo, etcd,Docker等。有兴趣也可以参考研究。

    ????Goland中使用Golang命令行工具

    ????使用Go案例完成开发到部署实践

    你可能还喜欢

    点击下方图片即可阅读

    Gitlab CICD构建Go项目

    Processed: 0.014, SQL: 8