Golang Go语言中项目如何定义全局 config 比较好?
Golang Go语言中项目如何定义全局 config 比较好?
需求: 在项目里使用 config 配置,并且配置可以通过命令行参数获取到。
目前实现方式: 项目目录下有 package config,运行服务 main.go 时通过执行 config.Init() 初始化配置,Init 则从命令行内读取参数初始化配置。
config.go
var (
KafkaTopic string
ConsulAddr string
)
func Init() {
flag.StringVar(&KafkaTopic, "KafkaTopic", "oss", "未指定 KafkaTopic")
flag.Parse()
log.Print(KafkaTopic)
}
// consul 的配置
var ConsulReg = consul.NewRegistry(func(op *registry.Options) {
flag.StringVar(&ConsulAddr, "ConsulAddr", "", "未指定 ConsulAddr")
flag.Parse()
log.Print(ConsulAddr) // 可以拿到命令行参数了
op.Addrs = []string{
ConsulAddr,
}
})
这里使用会报错 Incorrect Usage. flag provided but not defined: -ConsulAddr
尝试了各种姿势,不知道如何修改,google 已经不知道用什么关键词搜索了。 求助一下大佬们。
或者有更好的解决方式吗?
更多关于Golang Go语言中项目如何定义全局 config 比较好?的实战教程也可以访问 https://www.itying.com/category-94-b0.html
看一下 flag 包怎么用
更多关于Golang Go语言中项目如何定义全局 config 比较好?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
看了的,这个用法可以拿到参数,但是随后会报错。
flag 直接放 var 里定义:
var (
KafkaTopic = flag.String(“KafkaTopic”, “oss”, “未指定 KafkaTopic”)
ConsulAddr =flag.String(“ConsulAddr”, “”, “未指定 ConsulAddr”)
)
flag.Parse()在 main 开头运行一次就好
viper
也可以试下 https://github.com/guonaihong/clop
只要会定义结构体就行。
用 toml 文件…
支持 viper
你的 flag 定义放错位置了
这样不行,拿不到参数
感谢推荐,成功了!
感谢推荐哈,不过有用其他库搞定了
用了 yaml,用 viper 做解析
试了很多地方,包括 config.go 的 init,或者 Init,然后在 service 的 main 里调用,都不行,用库解决了
成功,搞定,3Q
三楼哪个不是不能用go<br>KafkaTopic = flag.String("KafkaTopic", "oss", "未指定 KafkaTopic")<br>ConsulAddr =flag.String("ConsulAddr", "", "未指定 ConsulAddr")<br>flag.Parse()<br>// 解指针获取值<br>KafkaTopicValue = *KafkaTopic <br>ConsulAddr Value = *ConsulAddr <br>
go<br>func init() {<br> configPath := flag.String("cfg", "", "未指定配置文件路径 -cfg")<br> flag.Parse()<br> configPathValue := *configPath<br> log.Print(configPathValue)<br>}<br>
输出<br>2020-03-18 00:40:18.785149 I | 获取到值<br>Incorrect Usage. flag provided but not defined: -cfg<br>
go<br> config_path := flag.String("config_path", `D:\Go-Work\src\`, "Test Config Path")<br> flag.Parse()<br><br> // 解指针获取值<br> config_dir := *config_path<br><br> log.Println(config_dir)<br>
使用 go build -o f main.go 之后,运行./f --config_path=‘value from console input.’
抱歉,以为你的代码有误,所以在 14 楼又回复你了。
我试了一下你 13 楼的代码 我这边可以运行。并没有出现你的错误。
可能你的运行环境有问题吧。
单个文件运行没问题,但是扔到项目里就报错= =
要确保在项目里是最先被初始化的。
是最先初始化的,log.Println 输出都是对的,输出完后报错
遇到错误就解决错误
在Golang项目中定义全局配置(config)通常涉及几个关键步骤,以确保配置易于管理、访问和更新。以下是一种推荐的做法:
-
配置文件格式:首先,选择一个合适的配置文件格式,如JSON、YAML或TOML。这些格式都易于人类阅读和机器解析。例如,YAML因其简洁性和可读性,在Go项目中非常受欢迎。
-
配置结构体:定义一个与配置文件结构相匹配的结构体。使用Go的标签功能来指定配置字段的JSON/YAML键名,以便在解析时正确映射。
-
加载配置:编写一个函数来加载和解析配置文件。这个函数应该处理文件读取错误,并返回配置结构体的实例。
-
全局访问:为了全局访问配置,可以将配置结构体作为包级变量存储在一个单独的包中(如
config
包)。在init
函数中加载配置,确保在程序启动时配置已就绪。 -
环境变量覆盖:考虑允许环境变量覆盖配置文件中的设置。这可以通过在加载配置时检查环境变量来实现,为开发和部署提供灵活性。
-
热更新:对于需要频繁更改配置的生产环境,实现配置的热更新机制(如通过信号或HTTP请求触发重新加载)可能是一个好主意。
通过上述步骤,你可以有效地在Go项目中定义和管理全局配置,确保配置的灵活性和可维护性。