[toc]git
以前使用过spring-boot
框架,在配置参数传递上能够使用配置文件--applications.yml,也能够使用命令行参数来覆盖,用起来很是方便。那么golang有没有相似功能呢?通过一番研究发现并无杀手级的第三方package,所以就有如下本身捣鼓出来的方法。github
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
设置默认值,所以有三个值得注意的地方:golang
toml
解析,再进行Parse
操做,以便让命令行参数覆盖配置文件参数;flag.Parse()
是全局的函数,其余的参数必须在调用config.Parse()
以前定义;除了标准库中的flag
也能够用第三方库,如下以kingpin为例:spring
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() }