Golang flag包使用详解(一)[转]

前端之家收集整理的这篇文章主要介绍了Golang flag包使用详解(一)[转]前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

概述

flag包提供了一系列解析命令行参数的功能接口

命令行语法

命令行语法主要有以下几种形式

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

以上语法对于一个或两个‘-’号,效果是一样的,但是要注意对于第三种情况,只支持非bool类型,原因是碰到如下情况时

  1. cmd -x *

*为0,false有可能表示一个文件名或文件,也有可能表示x标签的值为0或false,会产生二义性,因此规定第三种只支持非bool类型。对于整形flag,合法的值可以为1234,0664,238)">0x1234或负数等。对于布尔型flag,可以为1,238)">0,238)">t,238)">f,238)">T,238)">F,238)">true,238)">false,238)">TRUE,238)">FALSE,238)">True,238)">False等

命令行参数解析方法

使用flag主要包括以下几步

  1. 定义flag参数,有三种方式

    • 通过flag.String(),Bool(),Int()flag.Xxx()方法,该种方式返回一个相应的指针

      1. import "flag"
      2. var ip = flag.Int("flagname",1234,"help message for flagname")
    • 通过flag.XxxVar()方法将flag绑定到一个变量,该种方式返回值类型,如

      1. var flagvar int
      2. func init() {
      3. flag.IntVar(&flagvar,152)">"help message for flagname")
      4. }
    • 通过flag.Var()绑定自定义类型,自定义类型需要实现Value接口(Receives必须为指针),如

      1. flag.Var(&flagVal,152)">"name",152)">"help message for flagname")

      对于这种类型的flag,默认值为该变量类型的初始值

  2. 调用flag.Parse()解析命令行参数到定义的flag

    1. flag.Parse()

    解析函数将会在碰到第一个非flag命令行参数时停止,非flag命令行参数是指不满足命令行语法的参数,如命令行参数为cmd --flag=true abc则第一个非flag命令行参数为“abc”

  3. 调用Parse解析后,就可以直接使用flag本身(指针类型)或者绑定的变量了(值类型)

    1. fmt.Println("ip has value ",*ip)
    2. fmt."flagvar has value ",flagvar)

    还可通过flag.Args(),238)">flag.Arg(i)来获取非flag命令行参数

  4. 如果需要每个函数的详细demo,可参见Gopkg:flag

示例

  • 示例1: 获取“species” flag的值,默认为“gopher”

    1. var species = flag.String("species",152)">"gopher",152)">"the species we are studying")
  • 示例2: 两个flag共享同一个变量,一般用于同时实现完整flag参数和对应简化版flag参数,需要注意初始化顺序和默认值

    1. var gopherType string
    2.  
    3. init() {
    4. const (
    5. defaultGopher = "pocket"
    6. usage = "the variety of gopher"
    7. )
    8. flag.StringVar(&gopherType,152)">"gopher_type",defaultGopher,usage)
    9. flag.StringVar(&gopherType,152)">"g",usage+"(shorthand)")
    10. }
  • 示例3: 将flag绑定用户自定义类型。按我们先前所说,只需要实现Value接口,但实际上,如果需要取值的话,需要实现Getter接口,看下接口定义就明白了:

    1. type Getter interface { Value Get(string) interface{}
    2. }
    3. type Value interface { String() string Set(string) error }

    接下来,我们实现一个解析并格式化命令行输入的时间集合的例子,如下

    1. package main
    2.  
    3. import (
    4. "errors"
    5. "flag"
    6. "fmt"
    7. "strings"
    8. "time"
    9. )
    10.  
    11. type interval []time.Duration
    12.  
    13. //实现String接口
    14. func (i *interval) String() string {
    15. return fmt.Sprintf("%v",*i)
    16. }
    17.  
    18. //实现Set接口,Set接口决定了如何解析flag的值
    19. func (i *interval) Set(value string) error {
    20. //此处决定命令行是否可以设置多次-deltaT
    21. if len(*i) > 0 {
    22. return errors.New("interval flag already set")
    23. }
    24. for _,dt := range strings.Split(value,152)">",") {
    25. duration,err := time.ParseDuration(dt)
    26. if err != nil {
    27. return err
    28. }
    29. *i = append(*i,duration)
    30. }
    31. return nil
    32. }
    33.  
    34. var intervalFlag interval
    35.  
    36. func init() {
    37. flag.Var(&intervalFlag,152)">"deltaT",152)">"comma-separated list of intervals to use between events")
    38. }
    39.  
    40. func main() {
    41. flag.Parse()
    42. fmt.Println(intervalFlag)
    43. }

    运行结果:

    1. //./commandLine -deltaT 61m,72h,80s
    2. [1h1m0s 72h0m0s 1m20s]

猜你在找的Go相关文章