golang 命令行參數解析 hflag

簡介

hflag 是被設計用來替代標準的 flag 庫,提供更強大更靈活的命令行解析功能,相比標準庫,hflag 有以下特色python

  • 支持可選參數和必選參數
  • 支持參數縮寫
  • 支持位置參數,位置參數能夠出如今任意位置
  • 支持 bool 參數簡寫 (-aux-a -u -x 等效)
  • 支持值參數縮寫 (-p123456-p 123456 等效)
  • 更多類型的支持,支持 net.IPtime.Timetime.Duration[]int, []string 的解析
  • 更友好的用法幫助
  • 提供一套更簡潔的 api
  • 徹底兼容 flag 接口

用法

hflag 提供兩套 api,一套徹底兼容標準庫的 flag 接口,另外一套相似 pythonargparse 先定義 flag,在使用時從 flag 中獲取git

新接口

package main

import (
    "fmt"
    "github.com/hpifu/go-kit/hflag"
)

func main() {
    hflag.AddFlag("int", "int flag", hflag.Required(), hflag.Shorthand("i"), hflag.Type("int"), hflag.DefaultValue("123"))
    hflag.AddFlag("str", "str flag", hflag.Shorthand("s"), hflag.Required())
    hflag.AddFlag("int-slice", "int slice flag", hflag.Type("[]int"), hflag.DefaultValue("1,2,3"))
    hflag.AddFlag("ip", "ip flag", hflag.Type("ip"))
    hflag.AddFlag("time", "time flag", hflag.Type("time"), hflag.DefaultValue("2019-11-27"))
    hflag.AddPosFlag("pos", "pos flag")
    if err := hflag.Parse(); err != nil {
        panic(err)
    }

    fmt.Println("int =>", hflag.GetInt("i"))
    fmt.Println("str =>", hflag.GetString("s"))
    fmt.Println("int-slice =>", hflag.GetIntSlice("int-slice"))
    fmt.Println("ip =>", hflag.GetIP("ip"))
    fmt.Println("time =>", hflag.GetTime("time"))
    fmt.Println("pos =>", hflag.GetString("pos"))
}

go run hflag1.go -str abc -ip 192.168.0.1 --int-slice 4,5,6 posflag 將獲得以下輸出:github

int => 123
str => abc
int-slice => [4 5 6]
ip => 192.168.0.1
time => 2019-11-27 00:00:00 +0000 UTC
pos => posflag

flag 接口

package main

import (
    "fmt"
    "github.com/hpifu/go-kit/hflag"
    "time"
)

func main() {
    i := hflag.Int("int", 123, "int flag")
    s := hflag.String("str", "", "str flag")
    vi := hflag.IntSlice("int-slice", []int{1, 2, 3}, "int slice flag")
    ip := hflag.IP("ip", nil, "ip flag")
    t := hflag.Time("time", time.Now(), "time flag")
    if err := hflag.Parse(); err != nil {
        fmt.Println(hflag.Usage())
        panic(err)
    }

    fmt.Println("int =>", *i)
    fmt.Println("str =>", *s)
    fmt.Println("int-slice =>", *vi)
    fmt.Println("ip =>", *ip)
    fmt.Println("time =>", *t)
}

go run hflag2.go -str abc -ip 192.168.0.1 --int-slice 4,5,6 posflag 將獲得以下輸出:golang

int => 123
str => abc
int-slice => [4 5 6]
ip => 192.168.0.1
time => 2019-11-27 00:00:00 +0000 UTC
pos => posflag

幫助信息

hflag 會自動加入 -h/--help 選項,用戶能夠利用該選項,來查看幫助api

usage: hflag1 [pos] [-h,help bool] [-i,int int=123] [-int-slice []int=1,2,3] [-ip ip] <-s,str string> [-time time=2019-11-27]

positional options:
      pos          [string]           pos flag

options:
  -h, --help       [bool]             show usage
  -i, --int        [int=123]          int flag
    , --int-slice  [[]int=1,2,3]      int slice flag
    , --ip         [ip]               ip flag
  -s, --str        [string]           str flag
    , --time       [time=2019-11-27]  time flag

命令行語法

  • - 或者 -- 開頭的字段會被解析成選項,不然會被解析成位置參數,--- 是等效的
  • 選項中若是包含 = 號,會按照 = 分割成名稱和值 (-key=val)
  • 非 bool 選項後面的字段會被解析成該選項的值 (-key val)
  • bool 選項後面的字段若是是一個合法的 bool 值,會被當成該選項的值,不然設置爲 true (-b true)
  • 若是一個選項中的全部字母都是 bool 選項的縮寫,而且全部的選項都設置爲 true,(-aux-a -u -x 等效)
  • 容許一個選項縮寫後面直接加該選項的值 (-p123456-p 123456)

支持的數據類型名稱和 golang 內部類型的對應關係:app

  • int => int
  • string => string
  • float => float64
  • bool => bool
  • time => time.Duration
  • duration => time.Time
  • ip => net.IP
  • []int => []int
  • []string => []string

經常使用的數據類型格式:ui

  • 合法的 bool 值: 1, t, T, true, TRUE, True, 0, f, F, false, FALSE, False
  • 合法的 time 值: 2019-11-27, 2019-11-27T00:00:00, 2019-11-27T00:00:00Z8:00, now
  • []int 值: 1,2,3,4
  • []string: apple,banana

連接

轉載請註明出處
本文連接: https://tech.hatlonely.com/article/66
相關文章
相關標籤/搜索