V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
Flands
V2EX  ›  Go 编程语言

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

  •  
  •   Flands · 2020-03-15 00:29:41 +08:00 · 5631 次点击
    这是一个创建于 1716 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    19 条回复    2020-03-21 14:22:56 +08:00
    zxc12300123
        1
    zxc12300123  
       2020-03-15 01:08:09 +08:00 via iPhone
    看一下 flag 包怎么用
    Flands
        2
    Flands  
    OP
       2020-03-15 01:43:01 +08:00
    @zxc12300123 看了的,这个用法可以拿到参数,但是随后会报错。
    soy
        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 开头运行一次就好
    tikazyq
        4
    tikazyq  
       2020-03-15 08:01:13 +08:00
    viper
    guonaihong
        5
    guonaihong  
       2020-03-15 09:19:58 +08:00
    也可以试下 https://github.com/guonaihong/clop
    只要会定义结构体就行。
    tairan2006
        6
    tairan2006  
       2020-03-15 09:54:35 +08:00 via Android
    用 toml 文件…
    ArJun
        7
    ArJun  
       2020-03-15 10:25:56 +08:00
    支持 viper
    DelayNoMay
        8
    DelayNoMay  
       2020-03-15 13:20:25 +08:00
    你的 flag 定义放错位置了
    tottea
        9
    tottea  
       2020-03-15 13:49:38 +08:00
    Flands
        10
    Flands  
    OP
       2020-03-15 17:34:46 +08:00
    @soy 这样不行,拿不到参数

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

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

    @tairan2006 用了 yaml,用 viper 做解析
    Flands
        11
    Flands  
    OP
       2020-03-15 17:35:52 +08:00
    @DelayNoMay 试了很多地方,包括 config.go 的 init,或者 Init,然后在 service 的 main 里调用,都不行,用库解决了
    @tottea 成功,搞定,3Q
    BlackBerry999
        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
    ```
    Flands
        13
    Flands  
    OP
       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
        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.'
    BlackBerry999
        15
    BlackBerry999  
       2020-03-18 08:49:50 +08:00
    @Flands
    抱歉,以为你的代码有误,所以在 14 楼又回复你了。
    我试了一下你 13 楼的代码 我这边可以运行。并没有出现你的错误。
    可能你的运行环境有问题吧。
    Flands
        16
    Flands  
    OP
       2020-03-19 17:05:51 +08:00
    @BlackBerry999 单个文件运行没问题,但是扔到项目里就报错= =
    BlackBerry999
        17
    BlackBerry999  
       2020-03-20 09:19:58 +08:00
    @Flands
    要确保在项目里是最先被初始化的。
    Flands
        18
    Flands  
    OP
       2020-03-20 20:01:00 +08:00
    @BlackBerry999 是最先初始化的,log.Println 输出都是对的,输出完后报错
    BlackBerry999
        19
    BlackBerry999  
       2020-03-21 14:22:56 +08:00
    @Flands
    遇到错误就解决错误
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5608 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 35ms · UTC 08:36 · PVG 16:36 · LAX 00:36 · JFK 03:36
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.