专栏首页云原生生态圈Go - flag:命令行flags解析

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函数一个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,查看代码运行结果

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

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

本文分享自微信公众号 - 云原生生态圈(CloudNativeEcoSystem),作者:Marionxue

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-10-06

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 利用vscode插件icepanel可视化配置运行在k8s上的微服务

    在朋友圈发现一款高大上的kubernetes配置清单可视化编辑工具:icepanel官网是(https://icepanel.io),使用icepanel在几分...

    公众号: 云原生生态圈
  • tcpdump: 我来帮你过滤和分析系统中的网络数据

    公众号: 云原生生态圈
  • 2020年Kubernetes中7个最佳日志管理工具

    Kubernetes在容器编排市场中占主导地位,通常用于托管微服务。但是,微服务的每个实例都会生成大量日志事件,这些日志事件很快就会变得难以管理。更糟糕的是,当...

    公众号: 云原生生态圈
  • CTF基础 WriteUp——变量覆盖漏洞【1】

    思路:由于目的是要拿$flag的值,所以可以得出最终会输出两个变量,而$flag的值在红框那行,被我们自己post的值给覆盖,所以flag值肯定不会在这出来,那...

    逆向小白
  • Go 命令行参数

    用户5760343
  • CTF实战26 CTF题目练习和讲解四

    该培训中提及的技术只适用于合法CTF比赛和有合法授权的渗透测试,请勿用于其他非法用途,如用作其他非法用途与本文作者无关

    用户1631416
  • java的几个不错习题

    现在定义如下的一个数组:intoldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5},要求将以上数组中值为0的去掉,将不为0的值存...

    东风冷雪
  • 小姐姐教你做CTF逆向题:利用符号执行技术和约束求解器

    0x00 前言 在CTF比赛中,逆向类题目常常以考察选手的逆向分析能力、算法分析能力角度出发,通过还原程序中的算法逻辑,从而获取flag。但是如果可以在程序执行...

    ChaMd5安全团队
  • 绑定事件中 如可控制函数的执行次数

    大当家
  • 掘安MISC writeup持续更新

    点工具栏的Protocol使之通过传输协议排序,或者直接通过上面的过滤器,找TCP和HTTP即可(基础类型的一般这两个够用)。

    ly0n

扫码关注云+社区

领取腾讯云代金券