
需求: 在项目里使用 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 &nbp; 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 遇到错误就解决错误 |