概述

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

命令行语法

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

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

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

cmd -x *

*为0,false有可能表示一个文件名或文件,也有可能表示x标签的值为0或false,会产生二义性,因此规定第三种只支持非bool类型。对于整形flag,合法的值可以为12340664,0x1234或负数等。对于布尔型flag,可以为10tfTF,truefalseTRUEFALSETrueFalse

命令行参数解析方法

使用flag主要包括以下几步

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

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

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

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

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

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

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

    flag.Parse()

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

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

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

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

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

示例

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

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

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

    type Getter interface {
    Value
    Get(string) interface{}
    }
    type Value interface {
    String() string
    Set(string) error
    }

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

    package main
    
    import (
    "errors"
    "flag"
    "fmt"
    "strings"
    "time"
    ) type interval []time.Duration //实现String接口
    func (i *interval) String() string {
    return fmt.Sprintf("%v", *i)
    } //实现Set接口,Set接口决定了如何解析flag的值
    func (i *interval) Set(value string) error {
    //此处决定命令行是否可以设置多次-deltaT
    if len(*i) > 0 {
    return errors.New("interval flag already set")
    }
    for _, dt := range strings.Split(value, ",") {
    duration, err := time.ParseDuration(dt)
    if err != nil {
    return err
    }
    *i = append(*i, duration)
    }
    return nil
    } var intervalFlag interval func init() {
    flag.Var(&intervalFlag, "deltaT", "comma-separated list of intervals to use between events")
    } func main() {
    flag.Parse()
    fmt.Println(intervalFlag)
    }

    运行结果:

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

golang学习笔记 --flag的更多相关文章

  1. golang学习笔记20 一道考察对并发多协程操作一个共享变量的面试题

    golang学习笔记20 一道考察对并发多协程操作一个共享变量的面试题 下面这个程序运行的能num结果是什么? package main import ( "fmt" " ...

  2. golang学习笔记19 用Golang实现以太坊代币转账

    golang学习笔记19 用Golang实现以太坊代币转账 在以太坊区块链中,我们称代币为Token,是以太坊区块链中每个人都可以任意发行的数字资产.并且它必须是遵循erc20标准的,至于erc20标 ...

  3. golang学习笔记18 用go语言编写移动端sdk和app开发gomobile

    golang学习笔记18 用go语言编写移动端sdk和app开发gomobile gomobile的使用-用go语言编写移动端sdk和app开发https://blog.csdn.net/u01249 ...

  4. golang学习笔记17 爬虫技术路线图,python,java,nodejs,go语言,scrapy主流框架介绍

    golang学习笔记17 爬虫技术路线图,python,java,nodejs,go语言,scrapy主流框架介绍 go语言爬虫框架:gocolly/colly,goquery,colly,chrom ...

  5. golang学习笔记16 beego orm 数据库操作

    golang学习笔记16 beego orm 数据库操作 beego ORM 是一个强大的 Go 语言 ORM 框架.她的灵感主要来自 Django ORM 和 SQLAlchemy. 目前该框架仍处 ...

  6. golang学习笔记14 golang substring 截取字符串

    golang学习笔记14 golang substring 截取字符串golang 没有java那样的substring函数,但支持直接根据 index 截取字符串mystr := "hel ...

  7. golang学习笔记13 Golang 类型转换整理 go语言string、int、int64、float64、complex 互相转换

    golang学习笔记13 Golang 类型转换整理 go语言string.int.int64.float64.complex 互相转换 #string到intint,err:=strconv.Ato ...

  8. golang学习笔记12 beego table name `xxx` repeat register, must be unique 错误问题

    golang学习笔记12 beego table name `xxx` repeat register, must be unique 错误问题 今天测试了重新建一个项目生成新的表,然后复制到旧的项目 ...

  9. golang学习笔记11 golang要用jetbrain的golang这个IDE工具开发才好

    golang学习笔记11   golang要用jetbrain的golang这个IDE工具开发才好  jetbrain家的全套ide都很好用,一定要dark背景风格才装B   从File-->s ...

随机推荐

  1. Excel解析工具easyexcel全面探索

    1. Excel解析工具easyexcel全面探索 1.1. 简介 之前我们想到Excel解析一般是使用POI,但POI存在一个严重的问题,就是非常消耗内存.所以阿里人员对它进行了重写从而诞生了eas ...

  2. MES系统实施4大关键点,您都知道吗?

    MES是制造企业生产管理信息化的核心,能否成功实施和应用MES是企业实现提高生产效率,降低成本等信息化建设目标的关键所在. 但是,对于信息化基础相对薄弱的中国制造企业来说,MES的复杂性使得企业在进行 ...

  3. python通过连接池连接redis,操作redis队列

    在每次使用redis都进行连接的话会拉低redis的效率,都知道redis是基于内存的数据库,效率贼高,所以每次进行连接比真正使用消耗的资源和时间还多.所以为了节省资源,减少多次连接损耗,连接池的作用 ...

  4. 【Spring Boot】Spring Boot之使用ImportSelector类实现动态注册Bean

    一.ImportSelector类介绍     可以通过指定的选择条件来决定哪些类被注册到Spring中.与ImportBeanDefinitionRegistrar类功能相似,通过@Import的方 ...

  5. JAVAWEB复习day01

    一.基础知识 1.一个html文件开始和结束的标签<html></html> 2.html的两部分<head>设置相关信息</head>,<bod ...

  6. 201871010126 王亚涛 《面向对象程序设计(Java)》第七周实验总结

    ---恢复内容开始--- 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com ...

  7. django学习-安装、创建应用、编写视图

    快速安装指南 py -3 -m pip install django >>> import django >>> django.get_version() '2.2 ...

  8. python27期day13:闭包、装饰器初始、标准版装饰器、作业题

    1.闭包: 保护数据安全.保护数据干净性. 2.闭包的定义:在嵌套函数内.使用非全局变量(且不使用本层变量) 将嵌套函数返回 闭包的目的:要接受被装饰的函数和被装饰函数需要的参数3.闭包举例子: de ...

  9. 使用arthas 生成火焰图分析jvm

    arthas 是阿里巴巴开源的强大的jvm 应该分析工具,以下是使用arthas 生成jvm 火焰图的一个学习 项目使用docker-compose 运行,对于生成的火焰图使用nginx 提供一个访问 ...

  10. 交换机端口与Mac地址绑定(基于Cisco模拟器)

    实验设备: 二层交换机一台,主机三台 实验步骤: 1.进入相应的接口 (以端口1设置Mac地址绑定,PC0接1端口举例) Switch>enable Switch#config Configur ...