これが Go であるという事実を少し無視しましょう。最初に必要なのは、をマーシャリングするためのシリアル化形式です[]string
。
ここには多くのオプションがあります。独自にビルドすることも、ライブラリを使用することもできます。私は、あなたが独自のものを構築したくないと仮定し、シリアライゼーション形式がサポートするようにジャンプします。
すべての例で、data は[]string
ファイル、fp は読み取り/書き込み先のファイルです。エラーは無視されています。関数の戻り値をチェックして、エラーを処理してください。
ゴブ
Gob は go のみのバイナリ形式です。文字列の数が増えると、比較的スペース効率が良くなるはずです。
enc := gob.NewEncoder(fp)
enc.Encode(data)
読み方もシンプル
var data []string
dec := gob.NewDecoder(fp)
dec.Decode(&data)
ゴブはシンプルで要点です。ただし、この形式は他の Go コードでのみ読み取り可能です。
ジェイソン
次はjsonです。Json は、あらゆる場所で使用される形式です。このフォーマットも同様に使いやすいです。
enc := json.NewEncoder(fp)
enc.Encode(data)
そして読むために:
var data []string
dec := json.NewDecoder(fp)
dec.Decode(&data)
XML
XML は、もう 1 つの一般的な形式です。ただし、オーバーヘッドがかなり高く、使いやすいものではありません。gob と json で行ったのと同じことができますが、適切な xml にはルート タグが必要です。この場合、ルート タグ「Strings」を使用しており、各文字列は「S」タグでラップされています。
type Strings struct {
S []string
}
enc := xml.NewEncoder(fp)
enc.Encode(Strings{data})
var x Strings
dec := xml.NewDecoder(fp)
dec.Decode(&x)
data := x.S
CSV
CSVは他とは異なります。n 行で 1 つのレコードを使用するか、1 行で n レコードを使用するかの 2 つのオプションがあります。次の例では、n 個のレコードを使用しています。レコード一枚だとつまらない。それはあまりにも他のものに似ているでしょう。CSV は文字列のみを保持できます。
enc := csv.NewWriter(fp)
for _, v := range data {
enc.Write([]string{v})
}
enc.Flush()
読むには:
var err error
var data string
dec := csv.NewReader(fp)
for err == nil { // reading ends when an error is reached (perhaps io.EOF)
var s []string
s, err = dec.Read()
if len(s) > 0 {
data = append(data, s[0])
}
}
どの形式を使用するかは好みの問題です。私が言及していない他の多くの可能なエンコーディングがあります。たとえば、bencode という外部ライブラリがあります。私は個人的に bencode が好きではありませんが、動作します。これは、bittorrent メタデータ ファイルで使用されるのと同じエンコーディングです。
独自のエンコーディングを作成したい場合は、encoding/binary から始めるのがよいでしょう。これにより、可能な限り最もコンパクトなファイルを作成できますが、努力する価値があるとはほとんど思いません.