让flag支持从文件中读取命令行参数
golang标准库提供了flag包来处理命令行参数。常规的使用都是在命令行中启动服务的时候一一的输入,让程序解析。今天给大家介绍一种可以从文件中读取命令行参数的实现方法。
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参数flag.Var(&FlagFile, "flagfile", "")}//在Parse函数中调用,将解析到的命令行参数打印出来func visitFlag(f *flag.Flag) {fmt.Println(f.Name + "=" + f.Value.String())}func Parse() error {//先解析命令行中的-flagfile参数flag.Parse()var validFlagLines []stringflagContents, _ := ioutil.ReadFile(FlagFile)configContent := string(flagContents)// 统一使用\n作为换行符,以便后面按分隔符分隔字符串成切片configContent = strings.Replace(configContent, "\r\n", "\n", -1)flagLines := strings.Split(configContent, "\n")for _, line := range flagLines {//忽略掉以 # 开头的注释行if string([]rune(line)[0]) != "#" {//将每一行作为一个有效的命令行参数validFlagLines = append(validFlagLines, line)}}//实际执行解析命令行参数的地方,这里就又和常规的flag调用一样了_ := flag.CommandLine.Parse(validFlagLines)//将解析到的命令行参数都按visitFlag函数的格式输出flag.VisitAll(visitFlag)return nil}
# redis地址-redis_address=redisaddr.goxuetang.com# redis端口-redis_port=9999# 其他所有的命令行参数
好,接下来写个main函数测试一下,main函数中引入的gotech.github.com/m/flagfile/flagx 包是我项目下的定义路径,大家在实际开发中根据自己的项目组织包路径即可。
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() {//这里调用我们自定实现的Parse函数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推荐阅读
评论
