Go 语言:使用 flag 包解析命令行参数


#Go 语言#


如何获取命令行参数

可以通过 os.Args 获取命令行参数。os.Args 返回[]string。第0个是程序名,之后是命令行参数。

// hello.go

package main

import "fmt"
import "os"

func main() {
    for index, arg := range os.Args {
        fmt.Printf("%d -> %s\n", index, arg)
    }
}

编译可行文件名为 hello ,执行示例:

$ ./hello 
0 -> ./hello
$ ./hello -name letian
0 -> ./hello
1 -> -name
2 -> letian

当我们需要获取 -name 后面的值是多少时,就需要对 os.Args 进行解析。

例如:

// hello.go

package main

import "fmt"
import "os"

func main() {
    var name string
    for index, arg := range os.Args {
        if arg == "-name" {
            if index < len(os.Args)-1 {
                name = os.Args[index+1]
                break
            }
        }
    }
    fmt.Printf("name : %s\n", name)
}

执行结果示例:

$ go run hello.go -name       
name : 
$ go run hello.go -name letian
name : letian

但这种方式太麻烦了。好在 Go 本身提供了 flag 库用于解析一个命令行参数。

使用 flag 包解析命令行参数

示例1

// hello.go

package main

import "fmt"
import "flag"

func main() {
    var name *string = flag.String("name", "default name", "usage")
    flag.Parse()  // 这个不能漏
    fmt.Printf("name : %s\n", *name)
}

使用 flag.String 解析 -name 后面的值。flag.Parse()这个会触发真正的解析操作。

执行示例:

$ ./hello
name : default name
$ ./hello -name
flag needs an argument: -name
Usage of ./hello:
  -name string
        usage (default "default name")
$ ./hello -name letian
name : letian

示例2

使用 flag.Int 可以获取整数类型的参数。

// hello.go

package main

import "fmt"
import "flag"

func main() {
    var name *string = flag.String("name", "default name", "usage of name")
    var height *int = flag.Int("height", 180, "usage of height")
    flag.Parse()
    fmt.Printf("name : %s, height: %d\n", *name, *height)
}

执行示例:

$ go build hello.go

$ ./hello -name letian
name : letian, height: 180

$ ./hello             
name : default name, height: 180

$ ./hello -name       
flag needs an argument: -name
Usage of ./hello:
  -height int
        usage of height (default 180)
  -name string
        usage of name (default "default name")

$ ./hello -name letian -height 181
name : letian, height: 181

示例3

使用 flag.StringVarflag.IntVar 等Var结尾的函数,可以将解析的值写入指定变量。

代码示例:

// hello.go

package main

import "fmt"
import "flag"

func main() {
    var name string
    var height int

    flag.StringVar(&name, "name", "default name", "usage of name")
    flag.IntVar(&height, "height", 180, "usage of height")
    flag.Parse()

    fmt.Printf("name : %s, height: %d\n", name, height)
}

执行示例:

$ go build hello.go

$ ./hello -name letian
name : letian, height: 180

$ ./hello             
name : default name, height: 180

$ ./hello -name       
flag needs an argument: -name
Usage of ./hello:
  -height int
        usage of height (default 180)
  -name string
        usage of name (default "default name")

$ ./hello -name letian -height 181
name : letian, height: 181

( 本文完 )