如何获取命令行参数
可以通过 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.StringVar
、flag.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