13 ответов:
The JSON формат работал для меня довольно хорошо. Этот стандартная библиотека предлагает методы для записи структуры данных с отступом, так что это довольно читаемый.
см. также этот golang-орехи нити.
преимущества 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, который является INI-подобным форматом, созданным Томом Престоном-Вернером. Я построил парсер Go для него что это тщательно протестированы. Вы можете использовать его, как и другие варианты, предложенные здесь. Например, если у вас есть эти данные TOML в
something.tomlAge = 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 }
Я обычно использую JSON для более сложных структур данных. Недостатком является то, что вы легко получаете кучу кода, чтобы сообщить пользователю, где была ошибка, различные крайние случаи и что нет.
для базовой конфигурации (ключи API, номера портов, ...) Мне очень повезло с gcfg пакета. Он основан на формате git файл config.
из документации:
пример конфигурации:
; Comment line [section] name = value # Another comment flag # implicit value for bool is trueGo структуру:
type Config struct { Section struct { Name string Flag bool } }и код, необходимый для его чтения:
var cfg Config err := gcfg.ReadFileInto(&cfg, "myconfig.gcfg")Он также поддерживает значения среза, поэтому вы можете разрешить указывать ключ несколько раз и другие приятные функции, такие как это.
Випер это система управления конфигурацией golang, которая работает с JSON, YAML и TOML. Это выглядит довольно интересно.
просто использовать стандартный go flags С iniflags.
стандартные флаги go имеют следующие преимущества:
- идиоматическое.
- прост в использовании. Флаги могут быть легко добавлены и разбросаны по произвольным пакетам, которые использует ваш проект.
- флаги имеют стандартную поддержку значений и описания по умолчанию.
- флаги обеспечивают стандартный вывод "справка" со значениями по умолчанию и описание:.
единственный недостаток стандартных флагов go - это проблемы управления, когда количество флагов, используемых в вашем приложении, становится слишком большим.
Iniflags элегантно решает эту проблему: просто измените две строки в своем основном пакете, и он волшебным образом получит поддержку для чтения значений флага из ini-файла. Флаги из ini-файлов могут быть переопределены путем передачи новых значений в командной строке.
Смотрите также https://groups.google.com/forum/#! topic/golang-nuts / TByzyPgoAQE подробнее.
и 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 }
посмотреть gonfig
// load config, _ := gonfig.FromJson(myJsonFile) // read with defaults host, _ := config.GetString("service/host", "localhost") port, _ := config.GetInt("service/port", 80) test, _ := config.GetBool("service/testing", false) rate, _ := config.GetFloat("service/rate", 0.0) // parse section into target structure config.GetAs("service/template", &template)
https://github.com/spf13/viper и https://github.com/zpatrick/go-config являются довольно хорошими библиотеками для файлов конфигурации.
Я написал простую библиотеку ini config в golang.
goroutine-безопасный, простой в использовании
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/cfgu может анализировать 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) }
использовать toml эта статья чтение конфигурационных файлов Go way
вы также можете быть заинтересованы в go-libucl, набор Привязок Go для UCL, универсального языка конфигурации. UCL немного похож на JSON, но с лучшей поддержкой для людей: он поддерживает комментарии и удобочитаемые конструкции, такие как множители SI (10k, 40M и т. д.) и имеет немного меньше шаблонных (например, кавычки вокруг клавиш). Это на самом деле довольно близко к формату файла конфигурации nginx, если вы уже знакомы с этим.
Я согласен с Немо и я написал небольшой инструмент, чтобы сделать все это очень легко.
bitbucket.org/gotamer/cfg - это пакет конфигурации json
- вы определяете элементы конфигурации в своем приложении как структуру.
- шаблон конфигурационного файла json из вашей структуры сохраняется при первом запуске
- вы можете сохранить изменения во время выполнения в конфигурации
см. doc.перейти к примеру
Я попробовал JSON. Это сработало. Но я ненавижу создавать структуру точных полей и типов, которые я мог бы установить. Для меня это было болью. Я заметил, что это был метод, используемый всеми параметрами конфигурации, которые я мог найти. Возможно, мой опыт в динамических языках делает меня слепым к преимуществам такой многословности. Я сделал новый простой формат файла конфигурации и более динамичную библиотеку для его чтения из.
https://github.com/chrisftw/ezconf
Я довольно новичок в мире Go, так что это может быть не путь Go. Но это работает, это довольно быстро, и очень простой в использовании.
плюсы
- супер просто
- меньше кода
минусы
- нет массивов или типов карт
- очень плоский формат файла
- нестандартные файлы conf
- есть небольшая условность встроена, которую я сейчас будто хмурился в общем в го сообществе. (Ищет файл конфигурации в каталоге конфигурации)
Comments