需求: 在项目里使用 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 已经不知道用什么关键词搜索了。 求助一下大佬们。
或者有更好的解决方式吗?
1
zxc12300123 2020-03-15 01:08:09 +08:00 via iPhone
看一下 flag 包怎么用
|
2
Flands OP @zxc12300123 看了的,这个用法可以拿到参数,但是随后会报错。
|
3
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 开头运行一次就好 |
4
tikazyq 2020-03-15 08:01:13 +08:00
viper
|
5
guonaihong 2020-03-15 09:19:58 +08:00
也可以试下 https://github.com/guonaihong/clop
只要会定义结构体就行。 |
6
tairan2006 2020-03-15 09:54:35 +08:00 via Android
用 toml 文件…
|
7
ArJun 2020-03-15 10:25:56 +08:00
支持 viper
|
8
DelayNoMay 2020-03-15 13:20:25 +08:00
你的 flag 定义放错位置了
|
9
tottea 2020-03-15 13:49:38 +08:00
|
10
Flands OP |
11
Flands OP |
12
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 ``` |
13
Flands OP @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 ``` |
14
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.' |
15
BlackBerry999 2020-03-18 08:49:50 +08:00
|
16
Flands OP @BlackBerry999 单个文件运行没问题,但是扔到项目里就报错= =
|
17
BlackBerry999 2020-03-20 09:19:58 +08:00
@Flands
要确保在项目里是最先被初始化的。 |
18
Flands OP @BlackBerry999 是最先初始化的,log.Println 输出都是对的,输出完后报错
|
19
BlackBerry999 2020-03-21 14:22:56 +08:00
@Flands
遇到错误就解决错误 |