[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() }