Go 实战 | 让你的 flag 支持从文件中读取命令行参数
大家好,我是 Go 学堂的渔夫子。今天给大家介绍一个在项目中如何将命令行参数组织到文件中并进行解析的案例。
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.com
func Parse() {
// Ignore errors; CommandLine is set for ExitOnError.
CommandLine.Parse(os.Args[1:])
}
package flagx
//存储命令行传过来的文件路径
var FlagFile string
func 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 []string
flagContents, _ := 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 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() {
//这里调用我们自定实现的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
想要了解关于 Go 的更多资讯,还可以通过扫描的方式,进群一起探讨哦~
评论