GOLang CLI

栏目: Go · 发布时间: 6年前

内容简介:刚接触GoLang,发现大家在写CLI的时候都会直接使用Go语言中自动的flag或者cobra。想着自己以后接触Go的机会会非常多,所以今天就进行总结。其实就是翻译Cobra的README内容基本概念这里不过多的叙述,也就是commands,arguments,和flags

GOLang CLI

刚接触GoLang,发现大家在写CLI的时候都会直接使用 Go 语言中自动的flag或者cobra。想着自己以后接触Go的机会会非常多,所以今天就进行总结。

Cobra

其实就是翻译Cobra的README内容 https://github.com/spf13/cobra ,不过对应的中文翻译 https://o-my-chenjian.com/2017/09/20/Using-Cobra-With-Golang/

基本概念这里不过多的叙述,也就是commands,arguments,和flags

Generator的使用

这里主要介绍下Generator,因为Generator是一个非常好用的工具,可以非常方便的添加commands。

基本命令

cobra init:初始化

cobra add:添加子command

把cobra作为lib使用

添加子command

这个部分比较简单,在使用的过程中直接创建对应的command即可

使用flags

不过flags有多种类型:

1. Persistent

可以被当前的command使用,也可以被其child command(sub command)使用

2. Local

只能被当前command识别使用

3. Local Flag on Parent Commands

Command.TraverseChildren,如果不设置这个,local的flag在parent command会被ignore

4. Bind Flags with Config


5. Required flags

rootCmd.MarkFlagRequired("region")

6. 配置command的arg内容
https://github.com/spf13/cobra#positional-and-custom-arguments

GoLang自带

go lang中自带了command-line的一些工具,最常用的就是针对一个cli的argument和cli对应的options。以及两者的联合使用

arguments

首先会用到的就是一个CLI的argument。可以直接通过

args:=os.Args

返回的args是一个slice,slice的第一个元素是程序的path,也就是运行这个go程序的相对路径。args[1:]才是后边的args。参数按照空格的方式分割。

flag

经常使用还有CLI的一些option的内容,也就是根据flag获得对应flag的参数。

flag的实现是封装了CommandLine,CommandLine(其实就是一个FlagSet)中封装了多个flags,这些flags都是从os.args中转换出来的。一般都只会使用一些顶层接口,比如BoolVar,Arg

示例

var wordPtr = flag.String("word", "foo", "a string")
var numbPtr = flag.Int("numb", 42, "an int")
var boolPtr = flag.Bool("fork",false,"a bool")
func main() {
    flag.Parse()
    fmt.Println("word:", *wordPtr)
    fmt.Println("numb:", *numbPtr)
    fmt.Println("fork:", *boolPtr)
    
}

会根据flag的内容输出对应的option的结果。

flag和argument交叉使用

按照flag的例子接着使用一些argument的内容

var wordPtr = flag.String("word", "foo", "a string")
var numbPtr = flag.Int("numb", 42, "an int")
var boolPtr = flag.Bool("fork",false,"a bool")
func main() {
    flag.Parse()
    fmt.Println("word:", *wordPtr)
    fmt.Println("numb:", *numbPtr)
    fmt.Println("fork:", *boolPtr)
    
    fmt.Println("tail:", flag.Args())
    fmt.Println(flag.NArg())
    fmt.Println(flag.NFlag())
    fmt.Println(flag.Arg(2))
    args:=os.Args
    fmt.Println(args)
}

调用命令的方式为./main -word=word -fork=true 1 2 3 4

最终的结果是flag对应的Arg内容是最后的参数内容。但是os.Args还是按照arguments的规则来区分的。

注意在使用的时候options的内容(也就是flag的内容)在前边,arguments的内容在后边。这样可以直接使用flag来转化得到options和argument的内容。

pflag

pflag的基本功能和flag相同,但是支持一些更丰富的操作。

  1. 多种数据类型

  2. 支持更多种类型的参数,以及slice类型

  3. 支持shorthand,deprecated,hidden

一些特殊的需求可以使用pflag来实现。


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

特斯拉之父

特斯拉之父

竹内一正 / 千太阳 / 中信出版社 / 2014-12 / 39.00

马斯克的成就前无古人地跨越了各个领域,曾大起大落,成为亿万富翁后,又曾濒临破产。他凭借极强的控制欲、坚强的意志力把人生浓缩得异常精彩,拓展了人类对自身智力与能力限度的想象。乔布斯离开了,马斯克来了,后者离人更远,离神更近。 他的创业故事就是一部真实的好莱坞大片 美国《财富》杂志 “2013年度商业人物” 史上最富激情、传奇、未来感的企业家 他是个外表优雅的生意人、太空的挑战......一起来看看 《特斯拉之父》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具