Go - flag:命令行flags解析
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
对于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,查看代码运行结果
flag模块自动完成了帮助信息的生成,方便使用者查看帮助信息,以上就是golang的flag模块的简单认识。
同时在大型项目中,很多都是使用corba快速构建CLI程序,功能强大,使用便捷例如kubernetes, Hugo, etcd,Docker等。有兴趣也可以参考研究。
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法