简介

在Go程序编译好就是一个二进制文件,我们希望通过不同的参数来执行不同的操作,官方就提供了一个flag包,来实现这个功能。

流程

定义变量,注册falg -> flag.Parse 解析,并赋值变量 -> 就可以通过变量值判断执行对应的操作

定义变量,注册flag

  • 直接通过函数定义并赋值给变量(这里返回的是一个指针变量,取值的时候记得加&)
var number = flag.Int("n", 0, "get number from args")

第一个参数是命令行参数名称,第二个是默认值,第三个是参数提示内容

  • 也可以先声明变量,然后再对变量进行注册
var number int
func init() {
	flag.IntVar(&number, "n", 0,"get number from args")
}

第一个参数是变量指针,第二个命令行参数名称,第三个是默认值,第四个是参数提示内容

解析flag

直接调用Parse函数,就可以解析所有注册的flag

flag.Parse()

参数形式

命令行 flag 的语法有如下三种形式:

-flag // 只支持bool类型
-flag=x
-flag x // 只支持非bool类型

变量使用

  • 如果使用 flag.Int 方式声明的就需要通过&方式取值
fmt.Println(&number)
  • 如果是使用 flag.IntVar 方式声明的就可以直接使用了。
fmt.Println(number)

注册函数

以上是注册int类型的参数,其他类似是类似的

func Bool(name string, value bool, usage string) *bool
func BoolVar(p *bool, name string, value bool, usage string)
func Int(name string, value int, usage string) *int
func IntVar(p *int, name string, value int, usage string)
func Int64(name string, value int64, usage string) *int64
func Int64Var(p *int64, name string, value int64, usage string)
func Uint(name string, value uint, usage string) *uint
func UintVar(p *uint, name string, value uint, usage string)
func Uint64(name string, value uint64, usage string) *uint64
func Uint64Var(p *uint64, name string, value uint64, usage string)
func Float64(name string, value float64, usage string) *float64
func Float64Var(p *float64, name string, value float64, usage string)
func String(name string, value string, usage string) *string
func StringVar(p *string, name string, value string, usage string)
func Duration(name string, value time.Duration, usage string) *time.Duration
func DurationVar(p *time.Duration, name string, value time.Duration, usage string)

例子

package main

import (
	"flag"
	"fmt"
)

var number int

func init() {
	flag.IntVar(&number, "n", -1, "get number from args")
	flag.Parse()
}

func main() {
	fmt.Println(number)
}

如果执行的时候,-help或者-h,就会输出最后定义的帮助信息

./command1   -h
Usage of ./command1:
  -n int
    	get number from args

如果输入非法的参数,就会输出报错和帮助信息

./command1   -n a
invalid value "a" for flag -n: parse error
Usage of ./command1:
  -n int
    	get number from args

如果输入正确,就可以正常获取到对应的值,如果没有传值,就会使用默认值

./command1   -n 100
100