使用 toml 喜欢这篇文章 读取配置文件Go方式
我通常使用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")
它还支持切片值,因此您可以允许多次指定键以及其他类似功能。
毒蛇 是一个与JSON,YAML和TOML一起使用的golang配置管理系统。它看起来很有趣。
我在golang中编写了一个简单的ini配置库。
https://github.com/c4pt0r/cfg
goroutine-safe,易于使用
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) } }
===================更新=======================
最近我需要一个支持section的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) }
我已经开始使用了 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 }
我试过JSON。有效。但我讨厌必须创建我可能正在设置的确切字段和类型的结构。对我来说这是一种痛苦。我注意到这是我能找到的所有配置选项使用的方法。也许我在动态语言方面的背景让我对这种冗长的好处视而不见。我创建了一个新的简单配置文件格式,以及一个更加动态的lib来读取它。
https://github.com/chrisftw/ezconf
我对Go世界很陌生,所以它可能不是Go方式。但它有效,它非常快,而且使用起来非常简单。
我同意 尼莫 我写了一个小工具,让它变得非常容易。
bitbucket.org/gotamer/cfg 是一个json配置包
有关示例,请参见doc.go.
只需使用标准 去标志 同 iniflags 。
标准手旗有以下好处:
标准go标志的唯一缺点是 - 当您的应用程序中使用的标志数量变得太大时,管理问题。
Iniflags优雅地解决了这个问题:只需修改主包中的两行,它就会神奇地获得从ini文件中读取标志值的支持。可以通过在命令行中传递新值来覆盖ini文件中的标志。
也可以看看 https://groups.google.com/forum/#!topic/golang-nuts/TByzyPgoAQE 详情。
该 JSON 格式对我很有用。该 标准库提供了写入数据结构缩进的方法,所以它是相当的 可读。
也可以看看 这个golang-nuts线程 。
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]
你也可能对此有兴趣 去-libucl ,UCL的一组Go绑定,通用配置语言。 UCL有点像JSON,但有更好的人类支持:它支持注释和人类可读的结构,如SI乘法器(10k,40M等),并且有一点点样板(例如,键周围的引号)。它实际上非常接近nginx配置文件格式,如果您已经熟悉它。