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

本文介绍了如何在Golang中同时使用命令行参数和配置文件,探讨了使用配置文件设置默认值并允许命令行参数覆盖的方法。文章提到了需要注意的事项,如解析顺序和全局函数的影响,并提及了第三方库kingpin的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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()
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值