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来实现。


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

查看所有标签

猜你喜欢:

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

Responsive Web Design

Responsive Web Design

Ethan Marcotte / Happy Cog / 2011-6 / USD 18.00

From mobile browsers to netbooks and tablets, users are visiting your sites from an increasing array of devices and browsers. Are your designs ready? Learn how to think beyond the desktop and craft be......一起来看看 《Responsive Web Design》 这本书的介绍吧!

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

在线压缩/解压 HTML 代码

html转js在线工具
html转js在线工具

html转js在线工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具