处理Go程序的配置参数的首选方法是什么(在其他上下文中可能使用属性文件或ini文件的那种东西)?


当前回答

对于更复杂的数据结构,我通常使用JSON。缺点是,您很容易以一堆代码来告诉用户错误在哪里、各种边缘情况和其他情况。

对于基本配置(api密钥,端口号,…)我在使用gcfg包时运气非常好。它基于git配置格式。

从文档中可以看到:

示例配置:

; Comment line
[section]
name = value # Another comment
flag # implicit value for bool is true

结构:

type Config struct {
    Section struct {
            Name string
            Flag bool
    }
}

读取它所需的代码:

var cfg Config
err := gcfg.ReadFileInto(&cfg, "myconfig.gcfg")

它还支持切片值,因此您可以允许多次指定一个键和其他类似的好特性。

其他回答

另一种选择是使用TOML,这是Tom Preston-Werner创建的一种类似ini的格式。我为它构建了一个经过广泛测试的Go解析器。您可以像这里建议的其他选项一样使用它。例如,如果您在something.toml中有这个TOML数据

Age = 198
Cats = [ "Cauchy", "Plato" ]
Pi = 3.14
Perfection = [ 6, 28, 496, 8128 ]
DOB = 1987-07-05T05:45:00Z

然后你可以把它加载到你的Go程序中

type Config struct {
    Age int
    Cats []string
    Pi float64
    Perfection []int
    DOB time.Time
}

var conf Config
if _, err := toml.DecodeFile("something.toml", &conf); err != nil {
    // handle error
}

我已经开始使用Gcfg,它使用类似ini的文件。它很简单——如果你想要一些简单的东西,这是一个很好的选择。

下面是我目前使用的加载代码,它有默认设置,并允许命令行标志(未显示)覆盖我的一些配置:

package util

import (
    "code.google.com/p/gcfg"
)

type Config struct {
    Port int
    Verbose bool
    AccessLog string
    ErrorLog string
    DbDriver string
    DbConnection string
    DbTblPrefix string
}

type configFile struct {
    Server Config
}

const defaultConfig = `
    [server]
    port = 8000
    verbose = false
    accessLog = -
    errorLog  = -
    dbDriver     = mysql
    dbConnection = testuser:TestPasswd9@/test
    dbTblPrefix  =
`

func LoadConfiguration(cfgFile string, port int, verbose bool) Config {
    var err error
    var cfg configFile

    if cfgFile != "" {
        err = gcfg.ReadFileInto(&cfg, cfgFile)
    } else {
        err = gcfg.ReadStringInto(&cfg, defaultConfig)
    }

    PanicOnError(err)

    if port != 0 {
        cfg.Server.Port = port
    }
    if verbose {
        cfg.Server.Verbose = true
    }

    return cfg.Server
}

我同意尼莫,我写了一个小工具,让这一切都很容易。

Bitbucket.org/gotamer/cfg是一个json配置包

将应用程序中的配置项定义为结构。 在第一次运行时保存struct中的json配置文件模板 您可以保存对配置的运行时修改

看医生。举个例子

您可能还对Go -libucl感兴趣,这是一组用于UCL(通用配置语言)的Go绑定。UCL有点像JSON,但对人类有更好的支持:它支持注释和人类可读的结构,如SI乘子(10k, 40M等),并且有更少的模板(例如,键周围的引号)。它实际上非常接近nginx配置文件格式,如果你已经熟悉它的话。

我尝试了JSON。它工作。但我讨厌必须创建我可能要设置的确切字段和类型的结构体。对我来说,这是一种痛苦。我注意到,我能找到的所有配置选项都使用这种方法。也许我在动态语言方面的背景让我看不到这种冗长的好处。我制作了一个新的简单配置文件格式,以及一个更动态的库来读取它。

https://github.com/chrisftw/ezconf

我对围棋世界很陌生,所以这可能不是围棋的方式。但是它很有效,非常快,而且使用起来超级简单。

Pros

超级简单的 更少的代码

Cons

没有数组或Map类型 非常平面的文件格式 非标准的conf文件 它有一个内置的小约定,我现在在围棋社区普遍不赞成这个约定。(在config目录中查找配置文件)