命令行啟動服務的方式,在后端使用非常廣泛,如果有寫過C語言的同學相信不難理解這一點!在C語言中,我們可以根據argc和argv來獲取和解析命令行的參數,從而通過不同的參數調取不同的方法,同時也可以用Usage來打印幫助信息了。
那么開始今天的話題之前,我們回顧一下在C語言中是如何解析傳遞的參數的。
示例代碼:
編譯運行:
看完上面的例子,其實我們可以發現,上例中是C語言自帶的參數解析,對於簡單的參數構成還是可以使用的。下面我們再看一下Go語言os標准庫的實現。
示例代碼:
編譯執行:
上例中,我們可以看到os.Args返回一個數組,數組里面是我們命令行執行時,所傳遞的參數和程序名稱。os自帶的參數獲取,對於簡單的參數來說還能使用,如果參數復雜的情況下,那么解析起來就比較費勁的。這個時候,我們可以選擇Go語言的flag標准庫來幫我們處理命令行解析工作。
Flag包:https://golang.org/pkg/flag/
是Go語言提供的一個標准庫,能夠較為方便和靈活的解析命令行傳遞的參數。
flag有兩種方式:
1、flag.Type,其中Type可以是:int、string、bool,float等類型,返回指針類型。
參數1:flag的名稱
參數2:flag的值,上例中默認值是0
參數3:flag的描述
2、flag.TypeVar,將類型綁定到一個變量上。
參數1:flag的值
參數2:flag的名稱
參數3:flag的值,上例中默認值是0
參數4:flag的描述
示例代碼:
運行結果:
查看幫助:
Flag語法:
- -flag 只支持bool參數
- -flag=p
- -flag p bool類型不能使用,當p為false時會引起歧義
Flag解析:
parseOne()函數來處理-flag=value的,如果處理成功后,會將flag存儲到FlagSet.actucal map[string]*Flag中。
flag.Parse()函數來解析命令行中的參數中定義的flag,該方法遇到第一個非flag的命令方法就中止。
1、non-flag的時候,會終止解析工作。
2、連續兩個“-”的時候,會終止解析工作。
然后,再看我們傳遞錯誤的參數的返回情況。
跟蹤到代碼中可以看到如圖:
從上例可見,其實flag並沒有非常強大,下一章節會介紹一個更強大的命令行解析工具。
總結:
- os標准庫提供的解析方法,能夠解析簡單的命令行參數。
- flag能夠解析約定好的常規按照-flag傳遞的命令行參數,有幫助信息。
- os和flag還不能夠解析復雜結構的啟動參數。
喜歡的話,可以關注公眾號