Jestem nowy w programowaniu Go i zastanawiam się: jaki jest preferowany sposób obsługi parametrów konfiguracyjnych programu Go (rodzaj rzeczy, do których można użyć plików właściwości lub plików ini , w innych kontekstach)?
Jestem nowy w programowaniu Go i zastanawiam się: jaki jest preferowany sposób obsługi parametrów konfiguracyjnych programu Go (rodzaj rzeczy, do których można użyć plików właściwości lub plików ini , w innych kontekstach)?
Odpowiedzi:
JSON Format pracował dla mnie całkiem dobrze. Standardowa biblioteka oferuje metody zapisywania wciętej struktury danych, dzięki czemu jest dość czytelna.
Zobacz także ten wątek golang-nuts .
Zaletą JSON jest to, że jest on dość prosty do parsowania i jest czytelny / edytowalny przez człowieka, oferując jednocześnie semantykę list i odwzorowań (które mogą się bardzo przydać), czego nie ma w przypadku wielu parserów konfiguracji typu ini.
Przykładowe użycie:
conf.json :
{
"Users": ["UserA","UserB"],
"Groups": ["GroupA"]
}
Program do odczytu konfiguracji
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]
defer file.Close()
po sprawdzeniu open err
Inną opcją jest użycie TOML , który jest formatem INI stworzonym przez Toma Prestona-Wernera. I wbudowany parser go za to , że jest intensywnie testowany . Możesz używać go tak jak innych proponowanych tutaj opcji. Na przykład, jeśli masz te dane TOML wsomething.toml
Age = 198
Cats = [ "Cauchy", "Plato" ]
Pi = 3.14
Perfection = [ 6, 28, 496, 8128 ]
DOB = 1987-07-05T05:45:00Z
Następnie możesz załadować go do swojego programu Go za pomocą czegoś takiego
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
}
Viper to system zarządzania konfiguracją Golang, który współpracuje z JSON, YAML i TOML. Wygląda całkiem interesująco.
Zazwyczaj używam JSON do bardziej skomplikowanych struktur danych. Minusem jest to, że z łatwością dostajesz sporo kodu, aby poinformować użytkownika, gdzie był błąd, różne przypadki krawędzi i co nie.
Do podstawowej konfiguracji (klucze API, numery portów, ...) miałem bardzo dużo szczęścia z pakietem gcfg . Opiera się na formacie git config.
Z dokumentacji:
Przykładowa konfiguracja:
; Comment line
[section]
name = value # Another comment
flag # implicit value for bool is true
Przejdź do struktury:
type Config struct {
Section struct {
Name string
Flag bool
}
}
I kod potrzebny do odczytania:
var cfg Config
err := gcfg.ReadFileInto(&cfg, "myconfig.gcfg")
Obsługuje także wartości wycinków, dzięki czemu możesz pozwolić na wielokrotne określanie klucza i inne podobne funkcje.
Wystarczy użyć standardowych flag go z tagami iniflag .
Standardowe flagi go mają następujące zalety:
Jedyną wadą standardowych flag go są - problemy z zarządzaniem, gdy liczba flag używanych w aplikacji staje się zbyt duża.
Iniflags elegancko rozwiązuje ten problem: wystarczy zmodyfikować dwie linie w głównym pakiecie i uzyskuje magiczne wsparcie odczytu wartości flag z pliku ini. Flagi z plików ini można zastąpić, przekazując nowe wartości w wierszu polecenia.
Zobacz także https://groups.google.com/forum/#!topic/golang-nuts/TByzyPgoAQE, aby uzyskać szczegółowe informacje.
go test
nie pozwala mi na przekazywanie flag), podczas gdy plik konfiguracyjny nie.
*FlagName = value
Zacząłem używać Gcfg, który używa plików podobnych do Ini. To proste - jeśli chcesz czegoś prostego, to dobry wybór.
Oto kod ładujący, którego obecnie używam, który ma ustawienia domyślne i zezwala na flagi wiersza poleceń (nie pokazano), które zastępują niektóre ustawienia:
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
}
spójrz na 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 i https://github.com/zpatrick/go-config to całkiem niezłe biblioteki plików konfiguracyjnych.
Użyj toml jak ten artykuł Czytanie plików konfiguracyjnych po drodze
Napisałem prostą bibliotekę konfiguracji ini w golang.
bezpieczny dla goroutine, łatwy w użyciu
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)
}
}
=================== Aktualizacja =======================
Ostatnio potrzebuję parsera INI z obsługą sekcji i piszę prosty pakiet:
github.com/c4pt0r/cfg
możesz parsować INI, np. używając pakietu „flag”:
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)
}
Możesz być także zainteresowany go-libucl , zestawem powiązań Go dla UCL, Universal Configuration Language. UCL jest trochę podobny do JSON, ale z lepszym wsparciem dla ludzi: obsługuje komentarze i konstrukcje czytelne dla człowieka, takie jak mnożniki SI (10k, 40M itp.), I ma nieco mniej płyt kotłowych (np. Cudzysłowy wokół klawiszy). W rzeczywistości jest całkiem zbliżony do formatu pliku konfiguracyjnego nginx, jeśli już go znasz.
Zgadzam się z nemo i napisałem małe narzędzie, aby wszystko było naprawdę łatwe.
bitbucket.org/gotamer/cfg to pakiet konfiguracyjny json
Przykład: doc.go
Próbowałem JSON. Zadziałało. Ale nienawidzę konieczności tworzenia struktury dokładnych pól i typów, które mogę ustawić. Dla mnie to był ból. Zauważyłem, że była to metoda używana przez wszystkie opcje konfiguracji, jakie mogłem znaleźć. Być może moje doświadczenie w dynamicznych językach sprawia, że jestem ślepy na zalety takiej gadatliwości. Stworzyłem nowy prosty format pliku konfiguracyjnego i bardziej dynamiczną bibliotekę do odczytu.
https://github.com/chrisftw/ezconf
Jestem całkiem nowy w świecie Go, więc może to nie być droga Go. Ale to działa, jest dość szybki i bardzo prosty w użyciu.