मैं गो प्रोग्रामिंग में नया हूं, और मैं सोच रहा हूं: गो कार्यक्रम के लिए कॉन्फ़िगरेशन मापदंडों को संभालने का पसंदीदा तरीका क्या है (जिस तरह का सामान अन्य संदर्भों में संपत्तियों की फाइलों या आईएनआई फाइलों का उपयोग कर सकता है)?
मैं गो प्रोग्रामिंग में नया हूं, और मैं सोच रहा हूं: गो कार्यक्रम के लिए कॉन्फ़िगरेशन मापदंडों को संभालने का पसंदीदा तरीका क्या है (जिस तरह का सामान अन्य संदर्भों में संपत्तियों की फाइलों या आईएनआई फाइलों का उपयोग कर सकता है)?
जवाबों:
JSON प्रारूप काफी अच्छी तरह से मेरे लिए काम किया। मानक लाइब्रेरी डेटा संरचना को इंडेंट लिखने के लिए तरीके प्रदान करती है, इसलिए यह काफी पठनीय है।
इस गोलंग-नट्स धागे को भी देखें ।
JSON के लाभ यह है कि सूचियों और मैपिंग (जो काफी काम का हो सकता है) के लिए शब्दार्थ प्रदान करते समय पार्स और मानव पठनीय / संपादन योग्य है, जो कि कई ini-type config पार्सर के साथ ऐसा नहीं है।
उदाहरण का उपयोग:
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]
defer file.Close()
खुली गलती की जाँच करने के बाद चाहिए
एक अन्य विकल्प TOML का उपयोग करना है , जो टॉम प्रेस्टन-वर्नर द्वारा निर्मित एक INI जैसा प्रारूप है। मैंने इसके लिए एक गो पार्सर का निर्माण किया है जिसका बड़े पैमाने पर परीक्षण किया गया है । आप इसे यहां प्रस्तावित अन्य विकल्पों की तरह उपयोग कर सकते हैं। उदाहरण के लिए, यदि आपके पास यह TOML डेटा हैsomething.toml
Age = 198
Cats = [ "Cauchy", "Plato" ]
Pi = 3.14
Perfection = [ 6, 28, 496, 8128 ]
DOB = 1987-07-05T05:45:00Z
तब आप इसे अपने गो कार्यक्रम में कुछ इस तरह से लोड कर सकते हैं
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, YAML और TOML के साथ काम करती है। यह काफी दिलचस्प लग रहा है।
मैं आमतौर पर JSON का उपयोग अधिक जटिल डेटा संरचनाओं के लिए करता हूं। नकारात्मक पक्ष यह है कि आप आसानी से उपयोगकर्ता को यह बताने के लिए कोड का एक गुच्छा के साथ समाप्त करते हैं कि त्रुटि कहां थी, विभिन्न किनारे के मामले और क्या नहीं।
आधार विन्यास (एपीआई कुंजी, पोर्ट नंबर, ...) के लिए मुझे gcfg पैकेज के साथ बहुत अच्छी किस्मत मिली है। यह git config फॉर्मेट पर आधारित है।
प्रलेखन से:
नमूना विन्यास:
; 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")
यह स्लाइस मानों का भी समर्थन करता है, इसलिए आप कई बार एक प्रमुख विशेषता और अन्य अच्छी विशेषताओं को निर्दिष्ट करने की अनुमति दे सकते हैं।
बस iniflags के साथ मानक जाओ झंडे का उपयोग करें ।
मानक गो ध्वज के निम्नलिखित लाभ हैं:
एकमात्र दोष मानक गो ध्वज है - जब आपके ऐप में उपयोग किए जाने वाले झंडे की संख्या बहुत बड़ी हो जाती है तो प्रबंधन की समस्याएं होती हैं।
Iniflags सुरुचिपूर्ण ढंग से इस समस्या को हल करता है: बस अपने मुख्य पैकेज में दो पंक्तियों को संशोधित करें और यह ini फ़ाइल से ध्वज मानों को पढ़ने के लिए जादुई समर्थन प्राप्त करता है। Ini फ़ाइलों से फ़्लैग को कमांड-लाइन में नए मानों को पारित करके ओवरराइड किया जा सकता है।
विवरण के लिए https://groups.google.com/forum/# .topic/golang-nuts/TByzyPgoAQE भी देखें ।
go test
मुझे झंडे में पास नहीं होने देता) जबकि एक कॉन्फिग फाइल नहीं होगी।
*FlagName = value
मैंने 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 कॉन्फ़िगरेशन फ़ाइलों के लिए एक बहुत अच्छे पुस्तकालय हैं।
इस लेख की तरह toml का प्रयोग करें रीडिंग कॉन्फिग गो फाइल का रास्ता
मैंने गोलंग में एक साधारण आईएनआई कॉन्फिगर लाइब्रेरी लिखी।
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)
}
}
=================== अद्यतन =======================
हाल ही में मुझे अनुभाग समर्थन के साथ एक आईएनआई पार्सर की आवश्यकता है, और मैं एक साधारण पैकेज लिखता हूं:
github.com/c4pt0r/cfg
आप "ध्वज" पैकेज का उपयोग करके आईएनआई को पार्स कर सकते हैं:
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)
}
आपको यूनिवर्सल-कॉन्फ़िगरेशन भाषा, यूसीएल के लिए गो बाइंडिंग का एक सेट, गो -लिब्युलु में भी रुचि हो सकती है । यूसीएल जेएसएन की तरह एक सा है, लेकिन मनुष्यों के लिए बेहतर समर्थन के साथ: यह टिप्पणियों और मानव-पठनीय निर्माणों जैसे एसआई गुणक (10k, 40M, आदि) का समर्थन करता है और इसमें थोड़ा कम बॉयलरप्लेट (जैसे, कुंजियों के आसपास उद्धरण) है। यदि आप पहले से ही परिचित हैं, तो यह वास्तव में nginx कॉन्फ़िगरेशन फ़ाइल स्वरूप के बहुत करीब है।
मैं नीमो से सहमत हूं और मैंने इसे वास्तविक रूप से आसान बनाने के लिए एक छोटा सा उपकरण लिखा है।
bitbucket.org/gotamer/cfg एक json कॉन्फ़िगरेशन पैकेज है
उदाहरण के लिए doc.go देखें
मैंने JSON की कोशिश की। इसने काम कर दिया। लेकिन मुझे सटीक फ़ील्ड्स और मेरे द्वारा सेट किए जा सकने वाले प्रकारों की संरचना बनाने से नफरत है। मेरे लिए वो दर्द था। मैंने देखा कि यह सभी विन्यास विकल्पों द्वारा उपयोग की जाने वाली विधि थी जिसे मैं पा सकता था। हो सकता है कि गतिशील भाषाओं में मेरा बैकग्राउंड मुझे इस तरह के क्रिया-कलापों के लाभों से अंधा बना दे। मैंने एक नया सरल कॉन्फिग फाइल फॉर्मेट बनाया, और इसे पढ़ने के लिए एक अधिक गतिशील-ईश लीब।
https://github.com/chrisftw/ezconf
मैं गो संसार के लिए बहुत नया हूं, इसलिए यह गो मार्ग नहीं हो सकता है। लेकिन यह काम करता है, यह बहुत जल्दी है, और उपयोग करने के लिए सुपर सरल है।