golang同时使用命令行参数和配置文件
[toc]
之前使用过spring-boot
框架,在配置参数传递上可以使用配置文件--applications.yml,也可以使用命令行参数来覆盖,用起来非常方便。那么golang有没有类似功能呢?经过一番研究发现并没有杀手级的第三方package,因此就有以下自己捣鼓出来的方法。
Config
type Config struct{
Username string
Password string
}
func (c *Config)Parse(){
flag.StringVar(&c.Username,"username",c.Username,"the username for login")
flag.StringVar(&c.Password,"password",c.Password,"the password for login")
flag.Parse()
}
func NewConfig() *Config{
return &Config{
Username:"default_user",
Password:"default_password",
}
}
使用
package main
import (
"os"
"github.com/BurntSushi/toml"
)
var config *Config
func init(){
config = NewConfig()
if _,err:= os.Stat("config.toml");!os.IsNotExist(err){
if _,err := toml.DecodeFile("config.toml", config); err != nil {
panic(err)
}
}
config.Parse()
}
注意
以上方案事通过解析配置文件,给flag
设置默认值,因此有三个值得注意的地方:
- 必须先进行
toml
解析,再进行Parse
操作,以便让命令行参数覆盖配置文件参数; - 由于
flag.Parse()
是全局的函数,其他的参数必须在调用config.Parse()
之前定义; - 无法使用命令行参数来传递自定义配置文件路径。
使用kingpin
除了标准库中的flag
也可以用第三方库,以下以kingpin为例:
func (c *Config)Parse(){
kingpin.Flag("username","the username for login").Default(c.Username).Short('u').StringVar(&c.Username)
kingpin.Flag("password","the password for login").Default(c.Password).Short('p').StringVar(&c.Password)
kingpin.Parse()
}
来源:oschina
链接:https://my.oschina.net/u/3703365/blog/3042022