私はGoプログラミングの初心者ですが、疑問に思っています。Goプログラムの構成パラメーターを処理するための好ましい方法は何ですか(他のコンテキストでは、プロパティファイルやiniファイルを使用するようなものです)。
私はGoプログラミングの初心者ですが、疑問に思っています。Goプログラムの構成パラメーターを処理するための好ましい方法は何ですか(他のコンテキストでは、プロパティファイルやiniファイルを使用するようなものです)。
回答:
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]
defer file.Close()
、open errをチェックした後
もう1つのオプションは、Tom Preston-Wernerによって作成されたINIのような形式であるTOMLを使用することです。私はそれのために行くパーサに構築されて広範囲にテストを。ここで提案されている他のオプションと同様に使用できます。たとえば、このTOMLデータがある場合something.toml
Age = 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
}
Viperは、JSON、YAML、およびTOMLで動作するgolang構成管理システムです。かなり面白いですね。
私は通常、より複雑なデータ構造にJSONを使用します。欠点は、エラーの場所、さまざまなエッジケース、およびそうでないものをユーザーに知らせるためのコードの束が簡単に作成されることです。
基本構成(APIキー、ポート番号など)については、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")
また、スライス値もサポートしているため、キーを複数回指定したり、その他の便利な機能を指定したりできます。
標準のgoフラグには次の利点があります。
標準のgoフラグの唯一の欠点は、アプリで使用されるフラグの数が多すぎる場合の管理の問題です。
Iniflagsはこの問題をエレガントに解決します。メインパッケージの2行を変更するだけで、魔法のようにiniファイルからフラグ値を読み取ることができます。iniファイルのフラグは、コマンドラインで新しい値を渡すことで上書きできます。
詳細については、https://groups.google.com/forum/#!topic / golang-nuts / TByzyPgoAQEもご覧ください。
go test
ですが、構成ファイルではできませんが、テストが複雑になりすぎる(フラグを渡さない)ようです。
*FlagName = value
Iniライクなファイルを使用するGcfgを使い始めました。それは単純です-単純なものが必要な場合、これは良い選択です。
これは私が現在使用しているロードコードです。デフォルトの設定があり、一部の構成をオーバーライドするコマンドラインフラグ(図示せず)を許可します。
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
}
// 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この記事読んでconfigが囲碁の道をファイル
golangで簡単なini構成ライブラリを作成しました。
ゴロチン安全、使いやすい
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
uは、「フラグ」パッケージを使用するように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)
}
ユニバーサル構成言語であるUCLのGoバインディングのセットであるgo-libuclにも興味があるかもしれません。UCLはJSONに少し似ていますが、人間に対するサポートが強化されています。コメントと、SI乗数(10k、40Mなど)などの人間が読める構造をサポートし、ボイラープレート(たとえば、キーの周りの引用符)が少し少なくなっています。慣れていれば、実際はnginx構成ファイルの形式にかなり近いです。
私はネモに同意し、それをすべて本当に簡単にするための小さなツールを書きました。
bitbucket.org/gotamer/cfgはjson構成パッケージです
例については、doc.goを参照してください
JSONを試しました。出来た。しかし、私は設定している可能性のある正確なフィールドとタイプの構造体を作成する必要がありません。私にとってそれは苦痛でした。私が見つけたすべての構成オプションで使用されている方法に気づきました。たぶん、動的言語の私のバックグラウンドは、そのような冗長性の利点を私に盲目にさせます。新しいシンプルな構成ファイル形式を作成し、それを読み取るための動的なライブラリを作成しました。
https://github.com/chrisftw/ezconf
私は囲碁の世界ではかなり新しいので、囲碁のやり方ではないかもしれません。しかし、それは機能し、それはかなり速く、使用するのは非常に簡単です。