golang同时使用命令行参数和配置文件

扶醉桌前 提交于 2019-11-29 03:42:46

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()
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!