讓flag支持從文件中讀取命令行參數(shù)
golang標準庫提供了flag包來處理命令行參數(shù)。常規(guī)的使用都是在命令行中啟動服務的時候一一的輸入,讓程序解析。今天給大家介紹一種可以從文件中讀取命令行參數(shù)的實現(xiàn)方法。
var (RedisAddress string)func init() {flag.StrVar(&RedisAddress, "redis_address", "127.0.0.1", "this is redis address")}func main() {flag.Parse()if RedisAddress != "" {//redis初始化操作}fmt.Printf("redis address:%s\n", RedisAddress)}
go run main.go -redis_address=redisaddr.goxuetang.comfunc Parse() {// Ignore errors; CommandLine is set for ExitOnError.CommandLine.Parse(os.Args[1:])}

package flagx//存儲命令行傳過來的文件路徑var FlagFile stringfunc init() {//注冊命令行的flagfile參數(shù)flag.Var(&FlagFile, "flagfile", "")}//在Parse函數(shù)中調(diào)用,將解析到的命令行參數(shù)打印出來func visitFlag(f *flag.Flag) {fmt.Println(f.Name + "=" + f.Value.String())}func Parse() error {//先解析命令行中的-flagfile參數(shù)flag.Parse()var validFlagLines []stringflagContents, _ := ioutil.ReadFile(FlagFile)configContent := string(flagContents)// 統(tǒng)一使用\n作為換行符,以便后面按分隔符分隔字符串成切片??configContent?=?strings.Replace(configContent,?"\r\n",?"\n",?-1)flagLines := strings.Split(configContent, "\n")for _, line := range flagLines {//忽略掉以 # 開頭的注釋行if string([]rune(line)[0]) != "#" {//將每一行作為一個有效的命令行參數(shù)validFlagLines = append(validFlagLines, line)}}//實際執(zhí)行解析命令行參數(shù)的地方,這里就又和常規(guī)的flag調(diào)用一樣了??_?:=?flag.CommandLine.Parse(validFlagLines)??//將解析到的命令行參數(shù)都按visitFlag函數(shù)的格式輸出flag.VisitAll(visitFlag)return nil}
# redis地址-redis_address=redisaddr.goxuetang.com# redis端口-redis_port=9999# 其他所有的命令行參數(shù)
好,接下來寫個main函數(shù)測試一下,main函數(shù)中引入的gotech.github.com/m/flagfile/flagx 包是我項目下的定義路徑,大家在實際開發(fā)中根據(jù)自己的項目組織包路徑即可。
package mainimport ("flag""fmt""gotech.github.com/m/flagfile/flagx")var (RedisAddress stringRedisPort int)func init() {flag.StringVar(&RedisAddress, "redis_address", "127.0.0.1", "this is redis address")flag.IntVar(&RedisPort, "redis_port", 6379, "this is redis port")}func main() {//這里調(diào)用我們自定實現(xiàn)的Parse函數(shù)err := flagx.Parse()??fmt.Println("err:",?err)if RedisAddress != "" && RedisPort != 0 {//redis初始化操作}fmt.Printf("redis address:%s,port:%d\n", RedisAddress, RedisPort)}
go run main.go -flagfile=/data/conf/prod.gflags推薦閱讀
評論
圖片
表情
