Go语言命令行参数获取方法

发表时间: 2024-05-07 15:16

1 获取命令行参数

main.go

package mainimport (    "fmt"    "os")func main() {    var s, sep string    for i := 0; i < len(os.Args); i++ {        s += sep + os.Args[i]        sep = " "    }    fmt.Println(s)    fmt.Println(os.Args[1:]) //输出切片}

使用方法

D:\Go\study\src>go build main.go

D:\Go\study\src>bingfa.exe -a -b -c -d

bingfa.exe -a -b -c -d

[-a -b -c -d]

程序说明:

1.获得命令行参数需要使用包"os";

2.命令行参数通过包"os"传递, 参数存放在切片(slice)中, 其名字为os.Args[], os.Args[0]是命令本身, 其他的os.Args[i]则是命令的各个选项;

3.包"os"中, 还有os.Stdin等, 其含义一目了然;

实例: 获取命令行参数

package main //必须有个main包import(    "fmt"    "os" //os.Args 所需的包)func main(){    args := os.Args //获取用户输入的所有参数    //如果用户没有输入, 或参数个数不够, 则调用该函数提示用户    if args == nil || len(args) < 2{        fmt.Println("err: xxx ip port")        return    }    ip := args[1] //获取输入的第一个参数    port := args[2] //获取输入的第二个参数    fmt.Printf("ip = %s, port = %s\n", ip, port) //ip = 127.0.0.1, port = 88889    fmt.Println(len(args))}

执行方法:

go build getCommandParam.go
getCommandParam 127.0.0.1 8888

ip = 127.0.0.1, port = 8888

3


go run getCommandParam.go 127.0.0.1 3369

ip = 127.0.0.1, port = 3369

3

2 flag包对命令行参数的解析

上面的参数解析只是从命令行当中把参数存储在os.Args切片当中, 应用的时候, 不是很方便, 特别是, 编译好的一个可执行文件, 别人不知道如何使用的时候,

可以使用Go内置的flag包对参数进行说明, 并可设置默认值。

flag包的使用方法

flag.Type("flagName",defaultValue,"help message") *Type

flag包依据Type的类型, 和参数标志flagName, 对标志flagName设置默认值和帮助信息, 最终返回一个指向该类型的指针, 可以通过指针是否为空来判断命令行里是否使用该标志参数, 下面是一个例子。

package mainimport (    "flag"    "fmt")var b = flag.Bool("b", false, "bool类型参数") //bool型的数据不需要输入值, 否则会导致后面的参数无法接收var s = flag.String("s", "", "string类型参数")func main() {    flag.Parse()    fmt.Println("-b:", *b)    fmt.Println("-s:", *s)    fmt.Println("其他参数:", flag.Args())}

$ go run main.go

-b: false

-s:

其他参数: []

$ go run main.go -b

-b: true

-s:

其他参数: []

$ go run main.go -b -s test others

-b: true

-s: test

其他参数: [others]

$ go run main.go -help

Usage of /tmp/go-build080353851/command-line-arguments/_obj/exe/main:

-b bool类型参数

-s string

string类型参数

exit status 2


步骤:

1 定义参数

使用flag包, 首先定义待解析命令行参数, 也就是以"-"开头的参数, 比如这里的 -b -s -help等。-help不需要特别指定, 可以自动处理。

这里指定了两个参数,-b和-s:

var b = flag.Bool("b", false, "bool类型参数")

var s = flag.String("s", "", "string类型参数")

原型:

func Bool(name string, value bool, usage string) *bool

func String(name string, value string, usage string) *string

通过flag.Bool和flag.String, 建立了2个指针b和s, 分别指向bool类型和string类型的变量。所以后续要通过 *b 和 *s 使用变量值。

flag.Bool和flag.String的参数有3个, 分别是命令行参数名称, 默认值, 提示字符串。

参数 功能

name 命令行参数名称, 比如 -b, -help

value 默认值, 未显式指定的参数, 给出隐式的默认值, 比如本例中-b未给出的话, *b=false

usage 提示信息, 如果给出的参数不正确或者需要查看帮助 -help, 那么会给出这里指定的字符串


2 解析参数

flag使用前, 必须首先解析:

flag.Parse()


3 使用参数

上文已经说明, 通过flag方法定义好的参数变量指针, 通过间接引用操作即可使用其内容:

fmt.Println("-b:", *b)

fmt.Println("-s:", *s)


4 未解析参数

参数中没有能够按照预定义的参数解析的部分, 通过flag.Args()即可获取, 是一个字符串切片。

fmt.Println("其他参数:", flag.Args())

需要注意的是, 从第一个不能解析的参数开始, 后面的所有参数都是无法解析的。即使后面的参数中含有预定义的参数:

$ go run main.go -b stop -s test others

-b: true

-s:

其他参数: [stop -s test others]