加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Go语言的参数解析(flag)

发布时间:2020-12-16 18:43:44 所属栏目:大数据 来源:网络整理
导读:flag参数解析,我原以为会了,结果今天发现,原来比我印象中还强大些. 索性记一下. 第一个例子是常见用法: //Flag例1//author:Xiong Chuan Liang//date:2015-4-10package mainimport ("flag""fmt""os")var ( levelFlag = flag.Int("level","级别") bnFlag int )f
flag参数解析,我原以为会了,结果今天发现,原来比我印象中还强大些.
索性记一下.
第一个例子是常见用法:
//Flag例1
//author:Xiong Chuan Liang
//date:2015-4-10

package main

import (
	"flag"
	"fmt"
	"os"	
)

var (
	 levelFlag = flag.Int("level","级别")  
	 bnFlag int  
)

func init() {
	 flag.IntVar(&bnFlag,"bn",3,"份数")  
}

func main() {

	flag.Parse()  
    count := len(os.Args)
    fmt.Println("参数总个数:",count)

    fmt.Println("参数详情:")
    for i := 0 ; i < count ;i++{
        fmt.Println(i,":",os.Args[i])
    }
   
    fmt.Println("n参数值:")
	fmt.Println("级别:",*levelFlag)
	fmt.Println("份数:",bnFlag)
}


/*
运行结果:

C:TEMPtestflag>go run tf2.go -level 3 -bn=2
参数总个数: 4
参数详情:
0 : C:DOCUME~1ADMINI~1LOCALS~1Tempgo-build158983983command-line-arguments_objexetf2.exe
1 : -level
2 : 3
3 : -bn=2

参数值:
级别: 3
份数: 2


*/

第二个例子,可以扩展功能:
//Flag例2
//author:Xiong Chuan Liang
//date:2015-4-10

package main

import (
	"flag"
	"fmt"
	"os"
	"time"
)

var (
/*
	参数解析出错时错误处理方式
	switch f.errorHandling {
		case ContinueOnError:
			return err
		case ExitOnError:
			os.Exit(2)
		case PanicOnError:
			panic(err)
		} 
		*/

	//flagSet = flag.NewFlagSet(os.Args[0],flag.PanicOnError) 
	flagSet = flag.NewFlagSet(os.Args[0],flag.ExitOnError) 
	//flagSet = flag.NewFlagSet("xcl",flag.ExitOnError) 
	verFlag = flagSet.String("ver","","version")
	xtimeFlag  = flagSet.Duration("time",10*time.Minute,"time Duration")

	addrFlag = StringArray{}
)

func init() {
	flagSet.Var(&addrFlag,"a","b")
}

func main() {
	fmt.Println("os.Args[0]:",os.Args[0])
	flagSet.Parse(os.Args[1:]) //flagSet.Parse(os.Args[0:])

	fmt.Println("当前命令行参数类型个数:",flagSet.NFlag())  
	 for i := 0; i != flagSet.NArg(); i++ {  
        fmt.Printf("arg[%d]=%sn",i,flag.Arg(i))  
    }  

    fmt.Println("n参数值:")
	fmt.Println("ver:",*verFlag)
	fmt.Println("xtimeFlag:",*xtimeFlag)
	fmt.Println("addrFlag:",addrFlag.String())

	for i,param := range flag.Args(){
        fmt.Printf("---#%d :%sn",param)
    }
}


type StringArray []string

func (s *StringArray) String() string {
	return fmt.Sprint([]string(*s))
}

func (s *StringArray) Set(value string) error {
	*s = append(*s,value)
	return nil
}


/*
运行结果:
C:TEMPtestflag>go run tfs.go -ver 9.0 -a ba -a ca -a d2 -ver 10.0 -time 2m0s
os.Args[0]: C:DOCUME~1ADMINI~1LOCALS~1Tempgo-build341936307command-line-arguments_objexetfs.exe
当前命令行参数类型个数: 3

参数值:
ver: 10.0
xtimeFlag: 2m0s
addrFlag: [ba ca d2]



C:TEMPtestflag>go run tfs.go -ver 9.0 -a ba -a ca -a d2 -ver 10.0
os.Args[0]: C:DOCUME~1ADMINI~1LOCALS~1Tempgo-build712958211command-line-arguments_objexetfs.exe
当前命令行参数类型个数: 2

参数值:
ver: 10.0
xtimeFlag: 10m0s
addrFlag: [ba ca d2]



-- flagSet = flag.NewFlagSet(os.Args[0],flag.PanicOnError) 结果:
C:TEMPtestflag>go run tfs.go -ver 9.0 -a ba -a ca -a d2 -ver 10.0 -time 2m0s33
os.Args[0]: C:DOCUME~1ADMINI~1LOCALS~1Tempgo-build841833143command-line-arguments_objexetfs.exe
invalid value "2m0s33" for flag -time: time: missing unit in duration 2m0s33
Usage of C:DOCUME~1ADMINI~1LOCALS~1Tempgo-build841833143command-line-arguments_objexetfs.exe:
  -a=[]: b
  -time=10m0s: time Duration
  -ver="": version
panic: invalid value "2m0s33" for flag -time: time: missing unit in duration 2m0s33

goroutine 1 [running]:
flag.(*FlagSet).Parse(0x10b18180,0x10b42008,0xc,0x0,0x0)
        c:/go/src/flag/flag.go:814 +0xee
main.main()
        C:/TEMP/testflag/tfs.go:41 +0x163
exit status 2


-- flagSet = flag.NewFlagSet(os.Args[0],flag.ExitOnError) 结果:
C:TEMPtestflag>go run tfs.go -ver 9.0 -a ba -a ca -a d2 -ver 10.0 -time 2m0s33
os.Args[0]: C:DOCUME~1ADMINI~1LOCALS~1Tempgo-build501686683command-line-arguments_objexetfs.exe
invalid value "2m0s33" for flag -time: time: missing unit in duration 2m0s33
Usage of C:DOCUME~1ADMINI~1LOCALS~1Tempgo-build501686683command-line-arguments_objexetfs.exe:
  -a=[]: b
  -time=10m0s: time Duration
  -ver="": version
exit status 2


*/
flagSet类可以让参数处理更加灵活.
其中NewFlagSet:
flagSet = flag.NewFlagSet("xcl",flag.ExitOnError)
NewFlagSet的第一个参数是可以任意定的.但第二个参数,则决定了参数解析出错时错误处理方式.

如果要扩展参数定义,只要实现下面的接口:
 type Value interface {
	String() string
	Set(string) error
}
依例子中的 StringArray 一样.就可以实现如:
-a ba -a ca -a d2
addrFlag: [ba ca d2]

这种效果.

要知道,同样的:

-ver 9.0 -ver 10.0
最后的结果是 ver: 10.0 即参数只识别最末一次的.

没想到还能通过interface进行扩展,并且其使用比起Linux的getopt()系列函数.flag包这种方式还是更清晰直观.


BLOG: http://blog.csdn.net/xcl168

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读