1. 程式人生 > 其它 >golang 包之flag包

golang 包之flag包

在golang中有很多方法來處理命令列引數,簡單情況下可以不使用任何庫,直接使用os.Args;但是golang標準庫提供了flag包來處理命令列引數;還有第三方提供的處理命令列引數的庫cobra、cli。

flag包繫結解析引數有三種定義方式
flag.xxx() 例如:flag.Int, flag.String, 返回解析變數型別的指標

package main

import (
    "flag"
    "fmt"
)

func main() {
    host := flag.String("host", "127.0.0.1", "請輸入host地址")
    port := flag.Int("
port", 3306, "請輸入埠號") flag.Parse() // 解析引數 fmt.Printf("%s:%d\n", *host, *port) }

 

執行: go run main.go -host=127.0.0.1 -port=3306
輸出:127.0.0.1:3306
當然你也可以直接執行go run main.go, 這時候就會使用你的預設值

flag.XxxVar() 例如:flag.IntVar, flag.StringVar

 

package main

import (
    "flag"
    "fmt"
)
var host string
var port int
func init() { // 每個檔案會自動執行的函式 flag.StringVar(&host, "host", "127.0.0.1", "請輸入host地址") flag.IntVar(&port, "port", 3306, "請輸入埠號") } func main() { flag.Parse() // 解析引數 fmt.Printf("%s:%d\n", host, port) }

 

兩個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.Var(), 我們可以看下flag.go原始碼:

func Var(value Value, name string, usage string) {
CommandLine.Var(value, name, usage)
}

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


使用flag.Var函式第一個引數我們需要傳入一個Value型別的值,Value是一個介面型別,定義了兩個方法,接下來我們去實現這兩個方法:

 

package main

import (
    "flag"
    "fmt"
    "strings"
)

// 自定義型別
type HandsomeBoys []string

// 實現String()方法
func (h *HandsomeBoys) String() string {
    return fmt.Sprintf("%v", *h)
}

// 實現Set方法,Set介面決定了如何解析flag的值
func (h *HandsomeBoys) Set(s string) error {
    for _, v := range strings.Split(s, ",") {
        *h = append(*h, v)
    }
    return nil
}

// 定義一個HandsomeBoys型別的變數
var boys HandsomeBoys

func init() {
    // 繫結變數boys
    flag.Var(&boys, "boys", "請輸入一組帥氣的男孩名稱:-boys=彭于晏,吳彥祖")
}

func main() {
    flag.Parse()
    fmt.Println(boys)
}

 

首先需要理解FlagSet的概念,FlagSet的官方定義如下:

A FlagSet represents a set of defined flags.

直譯就是FlagSet代表一個flag的集合。

在具備FlagSet概念之後,我們再來回顧Flag的使用。

  • 設定階段,就是往FlagSet中插入一條flag記錄,返回一個指向flag所代表的值的指標,flag記錄中包括預設值,flag名稱,用法;
  • 解析階段,根據程式實際執行時引數的指定,覆蓋預設值;
  • 使用階段,根據設定階段返回的指標,來獲取flag的值。


參考連結:https://blog.csdn.net/weixin_42278305/article/details/110133125