flag实现命令行解析

简介: 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值的指针

通过简单的案例说明:

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函数一个subcommandNameErrorHandling来创建一个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分别是ab,然后通过os模块判断选项参数是否合法,通过switch结构解析str子命令后的所有flag,查看代码运行结果

image-20201006131205880

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

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

相关文章
|
2天前
|
存储 开发者 Python
Python中的argparse模块:命令行参数解析的利器
Python中的argparse模块:命令行参数解析的利器
18 2
|
2天前
|
机器学习/深度学习 编解码 API
FFmpeg命令行解析
FFmpeg命令行解析
101 1
|
2天前
|
Go
Go命令行解析神器入门 - 10分钟上手flag包
Go命令行解析神器入门 - 10分钟上手flag包
43 0
|
10月前
|
Shell Linux Perl
Linux shell元字符与命令行解析步骤
Linux shell元字符与命令行解析步骤
53 0
|
8月前
|
数据安全/隐私保护
深入解析 curl:掌握命令行的网络传输利器
当我们使用 `curl` 进行网络请求时,了解如何有效地使用参数是非常重要的。`curl` 提供了许多参数,用于控制请求的行为和配置。在这篇博客文章中,我们将详细解释一些常用的 `curl` 参数,帮助你更好地理解如何利用这个强大的工具。
173 2
深入解析 curl:掌握命令行的网络传输利器
|
9月前
|
存储 网络协议 API
4.9 C++ Boost 命令行解析库
命令行解析库是一种用于简化处理命令行参数的工具,它可以帮助开发者更方便地解析命令行参数并提供适当的帮助信息。C++语言中,常用的命令行解析库有许多,通过本文的学习,读者可以了解不同的命令行解析库和它们在C++项目中的应用,从而更加灵活和高效地处理命令行参数。
102 0
|
9月前
|
存储 开发工具 开发者
命令行参数解析神器:深入剖析Python中的argparse模块
命令行参数解析神器:深入剖析Python中的argparse模块
|
10月前
|
存储 Python
【Python标准库】argparse——命令行选项、参数和子命令解析器
【Python标准库】argparse——命令行选项、参数和子命令解析器
|
11月前
|
机器学习/深度学习 TensorFlow 算法框架/工具
Python基础 | 快速实现命令行参数解析
Python基础 | 快速实现命令行参数解析
67 0
|
11月前
|
存储 Go
Go 命令行参数解析工具 pflag 使用
Go 命令行参数解析工具 pflag 使用
235 0

推荐镜像

更多