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


当前回答

JSON格式非常适合我。的 标准库提供了缩进写入数据结构的方法,因此它是相当 可读。

看看这条高朗坚果线。

JSON的好处是它相当简单,易于解析和人类可读/编辑 同时为列表和映射提供语义(这可能会变得非常方便) 不是许多ini类型配置解析器的情况。

使用示例:

conf.json:

{
    "Users": ["UserA","UserB"],
    "Groups": ["GroupA"]
}

程序读取配置

import (
    "encoding/json"
    "os"
    "fmt"
)

type Configuration struct {
    Users    []string
    Groups   []string
}

file, _ := os.Open("conf.json")
defer file.Close()
decoder := json.NewDecoder(file)
configuration := Configuration{}
err := decoder.Decode(&configuration)
if err != nil {
  fmt.Println("error:", err)
}
fmt.Println(configuration.Users) // output: [UserA, UserB]

其他回答

另一种选择是使用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
}

Viper是一个golang配置管理系统,可以使用JSON、YAML和TOML。看起来很有趣。

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

只使用标准的go标志和iniflags。

去的旗帜

进口“国旗” var nFlag =标志。Int("n", 1234, "标志n的帮助信息")

iniflags

主要包 导入( “国旗” ... “github.com/vharitonsky/iniflags” ... ) var ( Flag1 =旗帜。字符串("flag1", "default1", "Description1") ... flagN = flag。Int("flagN", 123, " description ") ) Func main() { iniflags.Parse() //用它代替flag.Parse() }

标准go标志有以下好处:

惯用。 使用方便。标志可以很容易地添加并分散在项目使用的任意包中。 标志对默认值和描述有开箱即用的支持。 标志提供带有默认值和描述的标准“帮助”输出。

标准go标志的唯一缺点是,当你的应用程序中使用的标志数量过大时,会出现管理问题。

Iniflags巧妙地解决了这个问题:只需修改主包中的两行,它就神奇地获得了从ini文件读取标志值的支持。ini文件中的标志可以通过在命令行中传递新值来覆盖。

参见https://groups.google.com/forum/#!topic/golang-nuts/TByzyPgoAQE获取详细信息。