热门IT资讯网

GO命令行详细价绍

发表于:2024-11-28 作者:热门IT资讯网编辑
编辑最后更新 2024年11月28日,这篇文章为大家带来有关GO命令行的详细介绍。大部分命令行知识点都是大家经常用到的,为此分享给大家做个参考。一起跟随小编过来看看吧。目录▪ 一. os.Args▪ 二. flag▪ 三. 结合os.Ar

这篇文章为大家带来有关GO命令行的详细介绍。大部分命令行知识点都是大家经常用到的,为此分享给大家做个参考。一起跟随小编过来看看吧。

目录

▪ 一. os.Args
▪ 二. flag
▪ 三. 结合os.Args与flag实现子命令
▪ 附. 参考文档


一. os.Args

os.Args用于获取通过命令行传入的参数

os.Args[0]:程序执行路径
os.Args[1]:第1个参数
os.Args[2]:第2个参数
len(os.Args):参数数量

示例如下

package mainimport (    "fmt"    "os")func main() {    fmt.Println("Program:", os.Args[0])    for i, v := range os.Args[1:] {        fmt.Printf("Arg[%d]: %v\n", i, v)    }}

测试效果

# 编译执行go build arg.go./arg foo "hello world" bar# 输出Program: ./argArg[0]: fooArg[1]: hello worldArg[2]: bar

二. flag

golang内置的flag模块可以实现命令行flag解析。

什么是flag,举例说明(加粗部分就是flag):

▷ wc -l
▷ ./configure --prefix=/usr/local/nginx

示例如下(摘取自gobyexample)

package mainimport (    "flag"    "fmt")func main() {    // flag.String返回的是指针    // word表示参数名,foo表示默认值,a string表示参数释义(在-h或解析异常时候会看到)    // flag.Int、flag.Bool与flag.String同理,不再赘述    wordPtr := flag.String("word", "foo", "a string")    numbPtr := flag.Int("numb", 42, "an int")    boolPtr := flag.Bool("fork", false, "a bool")    // flag.StringVar返回的是非指针    var svar string    flag.StringVar(&svar, "svar", "bar", "a string var")    // 进行flag解析    flag.Parse()    fmt.Println("word:", *wordPtr)    fmt.Println("numb:", *numbPtr)    fmt.Println("fork:", *boolPtr)    fmt.Println("svar:", svar)    fmt.Println("tail:", flag.Args())}

测试效果

# 编译go build flag.go./flag -word=opt -numb=7 -fork -svar=flag# 输出word: optnumb: 7fork: truesvar: flagtail: []./flag -word=opt# 输出word: optnumb: 42fork: falsesvar: bartail: []./flag -word=opt a1 a2 a3# 输出word: optnumb: 42fork: falsesvar: bartail: [a1 a2 a3]./flag -word=opt a1 a2 a3 -numb=7# 输出word: optnumb: 42fork: falsesvar: bartail: [a1 a2 a3 -numb=7]./flag -h# 输出Usage of ./flag:  -fork        a bool  -numb int        an int (default 42)  -svar string        a string var (default "bar")  -word string        a string (default "foo")./flag -wat# 输出flag provided but not defined: -watUsage of ./flag:...

该例子,在测试时候只使用了"单横线+参数名",实际有4种方式,效果是相同的

-word opt-word=opt--word opt--word=opt

三. 结合os.Args与flag实现子命令

如果想实现子命令效果,例如:

▷ docker ps --last 10
▷ docker images --help

这需要将os.Args和flag结合使用。基本原理:创建多个flag集合(即*flag.FlagSet),每个flag集合对应不同的os.Args

示例如下(摘取自gobyexample)

package mainimport (    "flag"    "fmt"    "os")func main() {    fooCmd := flag.NewFlagSet("foo", flag.ExitOnError)    fooEnable := fooCmd.Bool("enable", false, "enable")    fooName := fooCmd.String("name", "", "name")    barCmd := flag.NewFlagSet("bar", flag.ExitOnError)    barLevel := barCmd.Int("level", 0, "level")    if len(os.Args) < 2 {        fmt.Println("expected 'foo' or 'bar' subcommands")        os.Exit(1)    }    switch os.Args[1] {    case "foo":        fooCmd.Parse(os.Args[2:])        fmt.Println("subcommand 'foo'")        fmt.Println(" enable:", *fooEnable)        fmt.Println(" name:", *fooName)        fmt.Println(" tail:", fooCmd.Args())    case "bar":        barCmd.Parse(os.Args[2:])        fmt.Println("subcommand 'bar'")        fmt.Println(" level:", *barLevel)        fmt.Println(" tail:", barCmd.Args())    default:        fmt.Println("expected 'foo' or 'bar' subcommands")        os.Exit(1)    }}

测试效果

# 编译go build subflag.go./subflag foo -enable -name=joe a1 a2# 输出subcommand 'foo'  enable: true  name: joe  tail: [a1 a2]./subflag bar -level 8 a1# 输出subcommand 'bar'  level: 8  tail: [a1]./subflag bar -enable a1# 输出flag provided but not defined: -enableUsage of bar:  -level int        level
以上就是GO命令行的详细内容了,看完之后是否有所收获呢?如果想了解更多相关内容,欢迎关注行业资讯,感谢各位的阅读!


0