go 项目如何定义全局 config 比较好?

2020-03-15 00:29:41 +08:00
 Flands

需求: 在项目里使用 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 已经不知道用什么关键词搜索了。 求助一下大佬们。
或者有更好的解决方式吗?

5409 次点击
所在节点    Go 编程语言
19 条回复
zxc12300123
2020-03-15 01:08:09 +08:00
看一下 flag 包怎么用
Flands
2020-03-15 01:43:01 +08:00
@zxc12300123 看了的,这个用法可以拿到参数,但是随后会报错。
soy
2020-03-15 04:33:31 +08:00
flag 直接放 var 里定义:
var (
KafkaTopic = flag.String("KafkaTopic", "oss", "未指定 KafkaTopic")
ConsulAddr =flag.String("ConsulAddr", "", "未指定 ConsulAddr")
)

flag.Parse()在 main 开头运行一次就好
tikazyq
2020-03-15 08:01:13 +08:00
viper
guonaihong
2020-03-15 09:19:58 +08:00
也可以试下 https://github.com/guonaihong/clop
只要会定义结构体就行。
tairan2006
2020-03-15 09:54:35 +08:00
用 toml 文件…
ArJun
2020-03-15 10:25:56 +08:00
支持 viper
DelayNoMay
2020-03-15 13:20:25 +08:00
你的 flag 定义放错位置了
tottea
2020-03-15 13:49:38 +08:00
Flands
2020-03-15 17:34:46 +08:00
@soy 这样不行,拿不到参数

@tikazyq @ArJun 感谢推荐,成功了!

@guonaihong 感谢推荐哈,不过有用其他库搞定了

@tairan2006 用了 yaml,用 viper 做解析
Flands
2020-03-15 17:35:52 +08:00
@DelayNoMay 试了很多地方,包括 config.go 的 init,或者 Init,然后在 service 的 main 里调用,都不行,用库解决了
@tottea 成功,搞定,3Q
BlackBerry999
2020-03-16 10:15:22 +08:00
@Flands 三楼哪个不是不能用
``` go
KafkaTopic = flag.String("KafkaTopic", "oss", "未指定 KafkaTopic")
ConsulAddr =flag.String("ConsulAddr", "", "未指定 ConsulAddr")
flag.Parse()
// 解指针获取值
KafkaTopicValue = *KafkaTopic
ConsulAddr Value = *ConsulAddr
```
Flands
2020-03-18 00:41:57 +08:00
@BlackBerry999
```go
func init() {
configPath := flag.String("cfg", "", "未指定配置文件路径 -cfg")
flag.Parse()
configPathValue := *configPath
log.Print(configPathValue)
}
```

输出
```
2020-03-18 00:40:18.785149 I | 获取到值
Incorrect Usage. flag provided but not defined: -cfg
```
BlackBerry999
2020-03-18 08:44:56 +08:00
@Flands
```go
config_path := flag.String("config_path", `D:\Go-Work\src\`, "Test Config Path")
flag.Parse()

// 解指针获取值
config_dir := *config_path

log.Println(config_dir)
```
使用 go build -o f main.go 之后,运行./f --config_path='value from console input.'
BlackBerry999
2020-03-18 08:49:50 +08:00
@Flands
抱歉,以为你的代码有误,所以在 14 楼又回复你了。
我试了一下你 13 楼的代码 我这边可以运行。并没有出现你的错误。
可能你的运行环境有问题吧。
Flands
2020-03-19 17:05:51 +08:00
@BlackBerry999 单个文件运行没问题,但是扔到项目里就报错= =
BlackBerry999
2020-03-20 09:19:58 +08:00
@Flands
要确保在项目里是最先被初始化的。
Flands
2020-03-20 20:01:00 +08:00
@BlackBerry999 是最先初始化的,log.Println 输出都是对的,输出完后报错
BlackBerry999
2020-03-21 14:22:56 +08:00
@Flands
遇到错误就解决错误

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/652880

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX