zoukankan      html  css  js  c++  java
  • go标准库之flag包

    命令行参数常用来为命令行程序指定选项。比如在 wc -l 命令中 -l 就是命令行参数。
    golang 提供了 flag 包来支持基本的命令行参数解析。

    命令行语法

    命令行语法如下:

    -flag
    -flag=x
    -flag x  // non-boolean flags only

    基本用法

    定义 flag 参数

    方法一:
    通过 flag.Xxx() 方法返回一个相应的指针,举几个栗子:

    wordPtr := flag.String("word", "foo", "a string")
    numbPtr := flag.Int("numb", 42, "an int")
    boolPtr := flag.Bool("fork", false, "a bool")

    使用形式为 flag.Type(name, defValue, usage)

    方法二:
    通过 flag.XxxVar() 方法将 flag 绑定到一个变量,该种方式返回值类型,举个栗子:

    var svar string
    flag.StringVar(&svar, "svar", "bar", "a string var")

    使用形式为 flag.TypeVar(&flagvar, name, defValue, usage)
    方法三:
    通过 flag.Var() 绑定自定义类型,自定义类型需要实现 Value 接口(Receives必须为指针),

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

    使用方式是 flag.Var(&flagvar, name, usage)

    解析

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

    其他

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

    栗子

    package main
    import "flag"
    import "fmt"
    import "strconv"
    type percentage float32
    func (p *percentage) Set(s string) error {
      v, err := strconv.ParseFloat(s, 32)
      *p = percentage(v)
      return err
    }
    func (p *percentage) String() string { return fmt.Sprintf("%f", *p) }
    func main() {
      namePtr := flag.String("name", "lyh", "user's name")
      agePtr := flag.Int("age", 22, "user's age")
      vipPtr := flag.Bool("vip", true, "is a vip user")
      var email string
      flag.StringVar(&email, "email", "lyhopq@gmail.com", "user's email")
      var pop percentage
      flag.Var(&pop, "pop", "popularity")
      flag.Parse()
      others := flag.Args()
      fmt.Println("name:", *namePtr)
      fmt.Println("age:", *agePtr)
      fmt.Println("vip:", *vipPtr)
      fmt.Println("pop:", pop)
      fmt.Println("email:", email)
      fmt.Println("other:", others)
    }
    $ ./command-line-flags
    name: lyh
    age: 22
    vip: true
    email: lyhopq@gmail.com
    other: []
    $ ./command-line-flags -name golang -age 4 -vip=true -pop 99 简洁 高并发 等等
    name: golang
    age: 4
    vip: true
    pop: 99
    email: lyhopq@gmail.com
    other: [简洁 高并发 等等]
    $ ./command-line-flags -h
    Usage of ./command-line-flags:
     -age=22: user's age
     -email="lyhopq@gmail.com": user's email
     -name="lyh": user's name
     -pop=0.0: popularity
     -vip=true: is a vip user
  • 相关阅读:
    [不断更新中]模板
    Noip 2018 游记
    [luogu3067 USACO12OPEN] 平衡的奶牛群
    [luogu4127 AHOI2009] 同类分布 (数位dp)
    [luogu4571 JSOI2009] 瓶子和燃料 (数论)
    [luogu4056 JSOI2009] 火星藏宝图 (贪心 dp)
    [luogu3573 POI2014] RAJ-Rally (拓扑排序 权值线段树)
    常见的狄利克雷卷积(一篇很好的博客上看到的)
    cz_xuyixuan
    [bzoj1951] [Sdoi2010]古代猪文 费马小定理+Lucas定理+CRT
  • 原文地址:https://www.cnblogs.com/cheyunhua/p/15587662.html
Copyright © 2011-2022 走看看