getenv获取不到环境变量_Go语言学习基础-命令行参数、标志、子命令、环境变量...

Command-Line Argument 命令行参数

命令行参数是参数化执行程序的常用方法。例如,命令go run hello.go中run和hello.go都属于go程序的参数。os.Args提供对原始命令行参数的访问。请注意,此切片中的第一个值是程序的路径,即命令本身,os.Args[1:]将参数保存到程序变量中。也可以通过索引获得的单独的参数。若要使用命令行参数,使用go build命令把程序构建为一个二进制文件,然后执行用参数执行该命令行程序。

4a4c743eee89a6a0c618fc85b6c35222.png

结果:

$ 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

结果:

$ 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

结果:

$ 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

结果:

$ go run environment-variables.go

FOO: 1

BAR:

TERM_PROGRAM

PATH

SHELL

...

$ BAR=2 go run environment-variables.go

FOO: 1

BAR: 2

...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值