概述

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

命令行语法

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

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

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

cmd -x *

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

命令行参数解析方法

使用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. 模拟退火算法SA原理及python、java、php、c++语言代码实现TSP旅行商问题,智能优化算法,随机寻优算法,全局最短路径

    模拟退火算法SA原理及python.java.php.c++语言代码实现TSP旅行商问题,智能优化算法,随机寻优算法,全局最短路径 模拟退火算法(Simulated Annealing,SA)最早的思 ...

  2. vue3.0和2.0的区别,Vue-cli3.0于 8月11日正式发布,更快、更小、更易维护、更易于原生、让开发者更轻松

    vue3.0和2.0的区别Vue-cli3.0于 8月11日正式发布,看了下评论,兼容性不是很好,命令有不少变化,不是特别的乐观vue3.0 的发布与 vue2.0 相比,优势主要体现在:更快.更小. ...

  3. css中的行内元素和块级元素总结

    块级元素 <address>,  <button>,  <caption>,  <dd>,  <del>,  <div>,  & ...

  4. wpf 工程生成dll

    在WPF项目里,当工程里包含窗体时候, 不可以使用类库的方式生产dll,虽然系统支持引用exe 文件,但总是觉得不如dll习惯,后来发现,新建个项目,类型选择“WPF自定义类件库”,名称和工程名称相同 ...

  5. Mac下安装npm全局包提示权限不够

    Mac OS下安装npm的全局包,总是出现如下提示Missing write access,需要提升权限才能继续. npm WARN checkPermissions Missing write ac ...

  6. day10 作业

    猜年龄升级版 ''' 1. 可以直接玩猜年龄游戏,不需要登录 2. 登录成功后玩猜年龄游戏 3. 猜年龄猜中后,可以选择两次奖品 4. 注册的用户名不能重复注册 ''' import random p ...

  7. Ubuntu的apt命令详解

    apt-cache和apt-get是apt包的管理工具,他们根据/etc/apt/sources.list里的软件源地址列表搜索目标软件.并通过维护本地软件包列表来安装和卸载软件. 查看本机是否安装软 ...

  8. 201871020225-牟星源《面向对象程序设计(java)》第十六周学习总结

    201871020225-牟星源<面向对象程序设计(java)>第十六周学习总结 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ ...

  9. android onActivityResult不被回调或窗体弹出后即补回调的解决办法

    假设从A窗体弹出B窗体,则在AndroidManifest.xml文件中,B不能有:android:launchMode="singleTask“属性,否则,A窗体里的onActivityR ...

  10. jenkins+maven+svn 持续集成环境搭建

    说明:部署传统的web应用(.war) 准备工作: (1) 系统环境:CentOS7 (2) 安装JDK:https://www.cnblogs.com/myitnews/p/11493847.htm ...