概述

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格式化输出-fmt包用法详解

    golang格式化输出-fmt包用法详解 注意:我在这里给出golang查询关于包的使用的地址:https://godoc.org    声明: 此片文章并非原创,大多数内容都是来自:https:// ...

  2. 抓包工具:tcpdump抓包命令详解

    抓包工具:tcpdump抓包命令详解 简介: tcpdump全称:dump the traffic on a network,根据使用者的定义对网络上的数据包进行截获的包分析工具. tcpdump可以 ...

  3. 整合Spring时Service层为什么不做全局包扫描详解

    合Spring时Service层为什么不做全局包扫描详解 一.Spring和SpringMVC的父子容器关系 1.讲问题之前要先明白一个关系 一般来说,我们在整合Spring和SpringMVC这两个 ...

  4. TCP协议粘包问题详解

    TCP协议粘包问题详解 前言 在本章节中,我们将探讨TCP协议基于流式传输的最大一个问题,即粘包问题.本章主要介绍TCP粘包的原理与其三种解决粘包的方案.并且还会介绍为什么UDP协议不会产生粘包. 基 ...

  5. spring盒springMVC整合父子容器问题:整合Spring时Service层为什么不做全局包扫描详解

    整合Spring时Service层为什么不做全局包扫描详解 一.Spring和SpringMVC的父子容器关系 1.讲问题之前要先明白一个关系 一般来说,我们在整合Spring和SpringMVC这两 ...

  6. golang(11) 反射用法详解

    原文链接:http://www.limerence2017.com/2019/10/14/golang16/ 反射是什么 反射其实就是通过变量动态获取其值和类型的一种技术,有些语言是支持反射的比如py ...

  7. 【Python实战】模块和包导入详解(import)

    1.模块(module) 1.1 模块定义 通常模块为一个.py文件,其他可作为module的文件类型还有".pyo".".pyc".".pyd&qu ...

  8. Spring3.0.5jar包用法详解 [转载]

    Spring3.X以后jar包进行了重构,取消了原来2.X版本中的总的spring.jar包,而是把总包中的功能全部分开打包.正在向osgi靠拢. 各个jar包详解如下: 1. org.springf ...

  9. Golang : flag 包简介

    在 Golang 程序中有很多种方法来处理命令行参数.简单的情况下可以不使用任何库,直接处理 os.Args:其实 Golang 的标准库提供了 flag 包来处理命令行参数:还有第三方提供的处理命令 ...

随机推荐

  1. BZOJ5484: [Usaco2018 Dec]Sort It Out

    5484: [Usaco2018 Dec]Sort It Out https://www.lydsy.com/JudgeOnline/problem.php?id=5484 Sol. 考虑没有在被喊叫 ...

  2. [CSP-S模拟测试]:金(king)(高精度+模拟)

    题目传送门(内部题36) 输入格式 第一行一个整数$T$,表示数据组数. 接下来$T$行,每行两个空格隔开的整数$n,m$. 输出格式 对于每组数据,输出一行$"Yes"$或$&q ...

  3. [jzoj5840]Miner 题解(欧拉路)

    首先考虑第一问.每个联通块的情况是相对独立的,所以可以分别求每个联通块的答案.无向图中存在欧拉路的条件是奇点数为0或2,那么合法方案肯定是tp到一个奇点,通过一条欧拉路到另一个奇点,再tp到另一个奇点 ...

  4. docker-compose快速搭建 Prometheus+Grafana监控系统

    一.说明Prometheus负责收集数据,Grafana负责展示数据.其中采用Prometheus 中的 Exporter含:1)Node Exporter,负责收集 host 硬件和操作系统数据.它 ...

  5. springmvc缓存 - cache

    前几篇文章已经搭建了一个基本的springmvc demo,现在我们来完善下.    相信大家写程序的时候都接触过缓存的概念,也都知道,数据量大的时候缓存对于提高效率是很显著的.而缓存一般包括前台静态 ...

  6. selenium2-java环境搭建 示例为chrome浏览器

    首先,安装并配置JDK,安装eclipse,安装firefox和chrome.下载selenium语言的JAVA库文件,下载地址为,如果打不开,则需要翻墙:http://www.seleniumhq. ...

  7. cannot find module node-sass

    解决方法: npm install --save-dev node-sass

  8. 以您熟悉的编程语言为例完成一个hello/hi的简单的网络聊天程序

    Socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,可以用来实现不同虚拟机或不同计算机之间的通信,应用程序通常通过"套接字"向网络发出 ...

  9. 转 Python - openpyxl 读写操作Excel

    Python - openpyxl 读写操作Excel   openpyxl特点   openpyxl(可读写excel表)专门处理Excel2007及以上版本产生的xlsx文件,xls和xlsx之间 ...

  10. Vertical-Align,你应该知道的一切

    我们聊聊vertical-align.这个属性主要目的用于将相邻的文本与元素对齐.而实际上,verticle-algin可以在不同上下文中灵活地对齐元素,以及进行细粒度的控制,不必知道元素的大小.元素 ...