まず、私はこの関連の質問を読むことをお勧めします:How to handle configuration in Go
次に、私は本当に別の形式で設定を保存検討します。あなたが提案するものは標準ではないからです。それはJava's property file format (.properties
)に近いですが、プロパティファイルでさえUnicodeシーケンスを含んでいる可能性があります。したがって、コードはUnicodeシーケンスをまったく処理しないため、有効な.properties
フォーマットパーサーではありません。
代わりにJSONを使用することをお勧めします.Goやその他の言語で簡単に解析でき、JSONテキストを編集するツールがたくさんありますが、それでも人にやさしいツールです。
JSON形式の場合、map
にデコードするのは、ただ1つの関数呼び出しです:json.Unmarshal()
です。json
パッケージには、書式設定し、あなたのためにエスケープ処理しますので、あなたは、任意の心配する必要はありません
map[Var1:Value1 Var2:Value2 Var3:Value3]
:
text := `{"Var1":"Value1", "Var2":"Value2", "Var3":"Value3"}`
var m map[string]string
if err := json.Unmarshal([]byte(text), &m); err != nil {
fmt.Println("Invalid config file:", err)
return
}
fmt.Println(m)
が出力(Go Playground上でそれを試してみてください):それはこのようになります。それらのまた、エラーを検出して報告します。また、JSONの方が柔軟性があり、設定に数値、テキスト、配列などが含まれている可能性があります。JSON形式を選択しただけで、すべて「無料」になります。
構成のもう1つの一般的な形式はYAMLですが、Go標準ライブラリにはYAMLパーサーが含まれていません。 Goの実装github.com/go-yaml/yaml
を参照してください。
フォーマットを変更したくない場合は、投稿したコードを使用します。これは、入力行を1行ずつ処理し、name = value
からの対を解析します各行。 そしてそれは明確かつ明白な方法でそれを行います。この目的のためにCSVやその他のリーダーを使用するのは悪いです(彼らは意図的に正当な形式の詳細や変換を隠すため)。 CSVリーダは、 CSVリーダ最初にです。 tabulator/comma symbolを変更したとしても、は特定のエスケープシーケンスを解釈し、プレーンテキストエディタに表示されるものとは異なるデータを与えることがあります。これは意図していない動作ですが、あなたの入力はではなく、CSV形式のではなく、として CSVと解釈するよう読者に依頼しました。
あなたのソリューションに追加する改善点は、bufio.Scanner
の使用です。これは、行単位で入力を読み込むために使用することができ、異なるスタイルの改行シーケンスを処理します。
text := `Var1=Value1
Var2=Value2
Var3=Value3`
scanner := bufio.NewScanner(strings.NewReader(text))
m := map[string]string{}
for scanner.Scan() {
parts := strings.Split(scanner.Text(), "=")
if len(parts) == 2 {
m[strings.TrimSpace(parts[0])] = strings.TrimSpace(parts[1])
}
}
if err := scanner.Err(); err != nil {
fmt.Println("Error encountered:", err)
}
fmt.Println(m)
出力は同じです。 Go Playgroundで試してみてください。 bufio.Scanner
を使用して
は別の利点があります:bufio.NewScanner()
は、「すべてのものは、バイトの源である」のための一般的なインターフェース、io.Reader
を受け入れます。これは、設定がファイルに保存されていて、すべての設定をメモリに読み込む必要がなくても、そのファイルを開くことができます。 os.Open()
と*os.File
の値を返します。*os.File
の値をbufio.NewScanner()
に直接渡すことができます(したがって、bufio.Scanner
は上記の例のようなメモリ内のバッファからではなくファイルから読み込みます)。
もし仕事をしても、私はそれについて心配しません。 Goは洗練されたコードについてではなく、作業コードについてです... – RickyA
それは失敗する可能性があるので、それにアクセスする前に '' len(tmp)> = 2''にテストを入れます( 'tmp [0]')。 – RickyA
@RickyA非常に良い点は、実際にはエラーをチェックしていません。私が取り組んでいるものにそれを加えるでしょう、ありがとう。 – Mikey