goFlag應用

newtrek發表於2018-01-14
仿nginx命令列

go語言些命令列程式是不錯的選擇,所以它可以輕鬆達到如上圖類似nginx命令列的效果

例子

package main

import (
    "flag"
    "fmt"
    "os"
)

//
var (
    h bool

    v,V bool
    t,T bool
    q *bool

    s string
    p string
    c string
    g string

    n int64
)

func init(){
    flag.BoolVar(&h,"h",false,"this help")
    flag.BoolVar(&v,"v",false,"show version and exit")
    flag.BoolVar(&V,"V",false,"show version and configure options then exit")
    flag.BoolVar(&t,"t",false,"test configuration and exit")
    flag.BoolVar(&T,"T",false,"test configuration,dump it and exit")

    //另一中繫結方式
    q = flag.Bool("q",false,"suppress non-error messages during configuration testing")
    //注意’signal‘,預設是 -S string 有了`signal`之後,變為-s signal
    flag.StringVar(&s,"s","","send `signal` to a master")
    flag.StringVar(&p,"p","/usr/local/nginx","set configuration `file`")
    flag.StringVar(&c,"c","conf/nginx.conf","set confiruration `file`")
    flag.StringVar(&g,"g","conf/nginx.conf","set global `directives` out of configuraton file")

    flag.Int64Var(&n,"n",0,"set `number`")
    //改變預設的usage
    flag.Usage=Usage
}

func main() {
    flag.Parse()
    if h {
        flag.Usage()
    }
    if len(s)!=0{
        fmt.Println(s)
    }
    if n !=0{
        fmt.Println(n)
    }
}

func Usage() {
    fmt.Fprintf(os.Stderr,`nginx version: nginx/1.10.0 Usage:nginx [-hvVtTq] [-n number] [-s signal] [-c filename] [-p prefix] [-g directives]
Options:
`)
    flag.PrintDefaults()
}

先執行go build或go install 編譯程式碼
執行FlagPrac -h 命令就可以輸出幫助資訊了
執行FlagPrac -s wang

執行FlagPrac -s wang

Flag 概述

參考:標準庫—命令列引數解析FLAG

兩種定義Flag方式

  • Flag.Xxx()

其中Xxx可以是Int,String等;返回一個相應型別的指標,如:

q = flag.Bool("q",false,"suppress non-error messages during configuration testing")
  • Flag.XxxVar()

將flag繫結到一個變數上,如:

flag.BoolVar(&h,"h",false,"this help")

另外還可以建立自定義flag,只要實現flag.Value介面即可

Flag解析

在所有的flag定義完成之後,可以通過呼叫flag.Prarse()進行解析,命令列flag的語法有如下三種方式:

  • flag //只支援bool型別
  • flag=x
  • flag x //只支援非bool型別

int型別可以是十進位制、十六進位制、八進位制甚至是負數;bool型別可以是1, 0, t, f, true, false, TRUE, FALSE, True, False。Duration可以接受任何time.ParseDuration能解析的型別

型別和函式

ErrHelp:該錯誤型別用於當命令列指定了-help引數但沒有定義時。
Usage:這是一個函式,用於輸出所有定義了的命令列引數和幫助資訊(usage message)。一般,當命令列引數解析出錯時,該函式會被呼叫。我們可以指定自己的Usage函式,即:flag.Usage = func(){}


相關文章