Command-Line Argument 命令行参数
命令行参数是参数化执行程序的常用方法。例如,命令go run hello.go中run和hello.go都属于go程序的参数。os.Args提供对原始命令行参数的访问。请注意,此切片中的第一个值是程序的路径,即命令本身,os.Args[1:]将参数保存到程序变量中。也可以通过索引获得的单独的参数。若要使用命令行参数,使用go build命令把程序构建为一个二进制文件,然后执行用参数执行该命令行程序。
![4a4c743eee89a6a0c618fc85b6c35222.png](https://i-blog.csdnimg.cn/blog_migrate/984ecaa79fc7c39f7b0f306c382e579b.jpeg)
结果:
$ go build command-line-arguments.go
$ ./command-line-arguments a b c d
[./command-line-arguments a b c d]
[a b c d]
c
Command-Line Flag 命令行标志
命令行标志是为命令行程序指定选项的常用方法,命令行标志也叫命令行选项。例如,在命令wc -l中,wc是命令,-l就是命令行标志。Go提供了一个flag包用于支持基本的命令行标志解析。
基本标志声明为字符串、整数和布尔值。以下示例中,使用函数flag.String声明一个字符串标志word,默认值为“foo”,并提供一个简短的描述。此函数返回一个字符串指针(而不是字符串值)。类似的,函数flag.Int声明numb整型标志和函数flag.Bool声明了fork布尔型标志。
也可以把一个已存在的变量声明为命令行选项,使用标志声明函数flag.StringVar,注意,需要传递变量的指针到这个函数。
调用函数flag.Parse()执行命令行解析。程序解析所定义好的选项参数和所有后续位置参数。请注意,需要解指针*wordptr才能引用到选项实际的值。尾随的位置参数需要使用flag.Args()来访问。
要使用命令行标志程序,首先使用go build命令编译为二进制文件。以定义好的选项执行命令,请注意,如果省略标志,则它们将自动采用默认值值。可以在任何标志之后提供尾随位置参数。请注意,标志包要求在位置参数之前使用所有标志参数(否则标志将被解释为位置参数),如程序结果所示。
使用-h或--help标志可获取命令行程序自动生成的帮助文本。如果提供的标志没有经过声明时,程序将打印错误消息并显示帮助文本。
![bd9a92b7a4ae467809112948d3729dda.png](https://i-blog.csdnimg.cn/blog_migrate/8e41b0030c0b77c17b850d9996633d37.jpeg)
结果:
$ go build command-line-flags.go
$ ./command-line-flags -word=opt -numb=7 -fork -svar=flag
word: opt
numb: 7
fork: true
svar: flag
tail: []
$ ./command-line-flags -word=opt
word: opt
numb: 42
fork: false
svar: bar
tail: []
$ ./command-line-flags -word=opt a1 a2 a3
word: opt
...
tail: [a1 a2 a3]
$ ./command-line-flags -word=opt a1 a2 a3 -numb=7
word: opt
numb: 42
fork: false
svar: bar
tail: [a1 a2 a3 -numb=7]
$ ./command-line-flags -h
Usage of ./command-line-flags:
-fork=false: a bool
-numb=42: an int
-svar="bar": a string var
-word="foo": a string
$ ./command-line-flags -wat
flag provided but not defined: -wat
Usage of ./command-line-flags:
...
Command-Line Subcommand 命令行子命令
一些命令行工具,如go工具或git有许多子命令,每个子命令都有自己的一组标志。例如,go build和go get是go工具的两个不同子命令。flag包允许我们轻松地定义具有自己标志的简单子命令。
使用flag.NewFlagSet声明一个子命令,并使用命令对象的方法Bool、Int和String等继续为此子命令定义相应类型值的标志。对于不同的子命令,可以定义不同的标志。
子命令应作为程序参数数组中os.Args索引为1的参数,索引0为程序名本身。switch语句检查调用了哪个子命令。对于每个子命令,使用该命令对象的Parse方法分析它自己的标志,并有权访问后面的位置参数。
![051895b8141acee2e0df2605cd69500a.png](https://i-blog.csdnimg.cn/blog_migrate/969d37936b2e36dbebd5753fc05786d4.jpeg)
结果:
$ go build command-line-subcommands.go
$ ./command-line-subcommands foo -enable -name=joe a1 a2
subcommand 'foo'
enable: true
name: joe
tail: [a1 a2]
$ ./command-line-subcommands bar -level 8 a1
subcommand 'bar'
level: 8
tail: [a1]
$ ./command-line-subcommands bar -enable a1
flag provided but not defined: -enable
Usage of bar:
-level int
level
Environment Variable 环境变量
环境变量是一种通用的机制,用于将系统配置信息传输到应用程序。让我们看看如何设置、获取和列出环境变量。
若要设置键/值对,请使用os.Setenv。
要获取键对应的值,请使用os.Getenv。如果环境中不存在该键,则返回空字符串。
使用os.Environ列出环境中的所有键/值对。该函数返回的是格式为KEY=value字符串列表,类型为切片。使用函数strings.SplitN拆分它们分别得到键和值。程序中打印出所有键。环境中的键列表将取决于计算机。
![d4def9ae1f6645d5e53c0209cb683c94.png](https://i-blog.csdnimg.cn/blog_migrate/322370863ecab88d8a34a92d1b1b8745.jpeg)
结果:
$ go run environment-variables.go
FOO: 1
BAR:
TERM_PROGRAM
PATH
SHELL
...
$ BAR=2 go run environment-variables.go
FOO: 1
BAR: 2
...