The Go Programming Language
› http://golang.org/
› Go Playground
Go Projects
› Revel Web Framework
Flands

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

  •  
  •   Flands · Mar 15, 2020 · 7062 views
    This topic created in 2428 days ago, the information mentioned may be changed or developed.

    需求: 在项目里使用 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 replies  •  2020-03-21 14:22:56 +08:00
    zxc12300123
    zxc12300123
    Mar 15, 2020 via iPhone
    1
    看一下 flag 包怎么用
    Flands
    Flands
    OP
    Mar 15, 2020
    2
    @zxc12300123 看了的,这个用法可以拿到参数,但是随后会报错。
    soy
    soy
    Mar 15, 2020
    3
    flag 直接放 var 里定义:
    var (
    KafkaTopic = flag.String("KafkaTopic", "oss", "未指定 KafkaTopic")
    ConsulAddr =flag.String("ConsulAddr", "", "未指定 ConsulAddr")
    )

    flag.Parse()在 main 开头运行一次就好
    tikazyq
    tikazyq
    Mar 15, 2020
    4
    viper
    guonaihong
    guonaihong
    Mar 15, 2020
    5
    也可以试下 https://github.com/guonaihong/clop
    只要会定义结构体就行。
    keenkiller
    keenkiller
    Mar 15, 2020 via Android
    6
    用 toml 文件…
    ArJun
    ArJun
    Mar 15, 2020
    7
    支持 viper
    DelayNoMay
    DelayNoMay
    Mar 15, 2020
    8
    你的 flag 定义放错位置了
    tottea
    tottea
    Mar 15, 2020
    9
    Flands
    Flands
    OP
    Mar 15, 2020
    10
    @soy 这样不行,拿不到参数

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

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

    @tairan2006 用了 yaml,用 viper 做解析
    Flands
    Flands
    OP
    Mar 15, 2020
    11
    @DelayNoMay 试了很多地方,包括 config.go 的 init,或者 Init,然后在 service 的 main 里调用,都不行,用库解决了
    @tottea 成功,搞定,3Q
    BlackBerry999
    BlackBerry999
    Mar 16, 2020
    12
    @Flands 三楼哪个不是不能用
    ``` go
    KafkaTopic = flag.String("KafkaTopic", "oss", "未指定 KafkaTopic")
    ConsulAddr =flag.String("ConsulAddr", "", "未指定 ConsulAddr")
    flag.Parse()
    // 解指针获取值
    KafkaTopicValue = *KafkaTopic
    ConsulAddr Value = *ConsulAddr
    ```
    Flands
    Flands
    OP
    Mar 18, 2020
    13
    @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
    BlackBerry999
    Mar 18, 2020
    14
    @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
    BlackBerry999
    Mar 18, 2020
    15
    @Flands
    抱歉,以为你的代码有误,所以在 14 楼又回复你了。
    我试了一下你 13 楼的代码 我这边可以运行。并没有出现你的错误。
    可能你的运行环境有问题吧。
    Flands
    Flands
    OP
    Mar 19, 2020
    16
    @BlackBerry999 单个文件运行没问题,但是扔到项目里就报错= =
    BlackBerry999
    BlackBerry999
    Mar 20, 2020
    17
    @Flands
    要确保在项目里是最先被初始化的。
    Flands
    Flands
    OP
    Mar 20, 2020
    18
    @BlackBerry999 是最先初始化的,log.Println 输出都是对的,输出完后报错
    BlackBerry999
    BlackBerry999
    Mar 21, 2020
    19
    @Flands
    遇到错误就解决错误
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1116 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 38ms · UTC 23:53 · PVG 07:53 · LAX 15:53 · JFK 18:53
    ♥ Do have faith in what you're doing.