Go 實戰(zhàn) | 讓你的 flag 支持從文件中讀取命令行參數(shù)
大家好,我是 Go 學堂的漁夫子。今天給大家介紹一個在項目中如何將命令行參數(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.com
func?Parse()?{
??//?Ignore?errors;?CommandLine?is?set?for?ExitOnError.
??CommandLine.Parse(os.Args[1:])
}
package?flagx
//存儲命令行傳過來的文件路徑
var?FlagFile?string
func?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?[]string
??flagContents,?_?:=?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?main
import?(
??"flag"
??"fmt"
??"gotech.github.com/m/flagfile/flagx"
)
var?(
??RedisAddress?string
??RedisPort????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
想要了解關(guān)于 Go 的更多資訊,還可以通過掃描的方式,進群一起探討哦~
評論
圖片
表情
