golang同時使用命令行參數和配置文件

golang同時使用命令行參數和配置文件

[toc]git

以前使用過spring-boot框架,在配置參數傳遞上能夠使用配置文件--applications.yml,也能夠使用命令行參數來覆蓋,用起來很是方便。那麼golang有沒有相似功能呢?通過一番研究發現並無殺手級的第三方package,所以就有如下本身搗鼓出來的方法。github

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設置默認值,所以有三個值得注意的地方:golang

  • 必須先進行toml解析,再進行Parse操做,以便讓命令行參數覆蓋配置文件參數;
  • 因爲flag.Parse()是全局的函數,其餘的參數必須在調用config.Parse()以前定義;
  • 沒法使用命令行參數來傳遞自定義配置文件路徑。

使用kingpin

除了標準庫中的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()
}
相關文章
相關標籤/搜索