处理Go程序的配置参数的首选方法是什么(在其他上下文中可能使用属性文件或ini文件的那种东西)?
当前回答
我已经开始使用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
}
其他回答
您可能还对Go -libucl感兴趣,这是一组用于UCL(通用配置语言)的Go绑定。UCL有点像JSON,但对人类有更好的支持:它支持注释和人类可读的结构,如SI乘子(10k, 40M等),并且有更少的模板(例如,键周围的引号)。它实际上非常接近nginx配置文件格式,如果你已经熟悉它的话。
Viper是一个golang配置管理系统,可以使用JSON、YAML和TOML。看起来很有趣。
只使用标准的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获取详细信息。
我用golang写了一个简单的ini配置库。
https://github.com/c4pt0r/cfg
gorroutine安全,易于使用
package cfg
import (
"testing"
)
func TestCfg(t *testing.T) {
c := NewCfg("test.ini")
if err := c.Load() ; err != nil {
t.Error(err)
}
c.WriteInt("hello", 42)
c.WriteString("hello1", "World")
v, err := c.ReadInt("hello", 0)
if err != nil || v != 42 {
t.Error(err)
}
v1, err := c.ReadString("hello1", "")
if err != nil || v1 != "World" {
t.Error(err)
}
if err := c.Save(); err != nil {
t.Error(err)
}
}
=================== 更新 =======================
最近,我需要一个INI解析器与节支持,我写了一个简单的包:
github.com/c4pt0r/cfg
你可以像使用"flag"包一样解析INI:
package main
import (
"log"
"github.com/c4pt0r/ini"
)
var conf = ini.NewConf("test.ini")
var (
v1 = conf.String("section1", "field1", "v1")
v2 = conf.Int("section1", "field2", 0)
)
func main() {
conf.Parse()
log.Println(*v1, *v2)
}
我同意尼莫,我写了一个小工具,让这一切都很容易。
Bitbucket.org/gotamer/cfg是一个json配置包
将应用程序中的配置项定义为结构。 在第一次运行时保存struct中的json配置文件模板 您可以保存对配置的运行时修改
看医生。举个例子