配列内の一意の文字列の維持
提供されたコードでは、一意の文字列の配列を作成することを目的としています。ただし、Go 配列には一意の要素が必要なため、動的に追加された文字列で一意性を強制することが困難になります。ここで、一意の文字列値を許可するデータ構造をどのように作成するかという問題が生じます。
マップをセットとして使用する
Go にはネイティブのセット データ型がないため、マップはこの目的に効果的に活用できます。マップ キーの一意性は、一意の文字列コレクションの基盤となります。
オプション 1: ブール値を使用したマップ
空でないマップ (true) は、次のセットを表すことができます。独特の文字列。例:
m := make(map[string]bool) m["aaa"] = true m["bbb"] = true m["bbb"] = true // Ignored as "bbb" already exists m["ccc"] = true
このアプローチは、セットの読みやすく直感的な表現を提供します。
オプション 2: 構造体の値を使用したマップ
メモリ使用量を最小限に抑えるため、struct{} 値型のマップを使用できます。構造体はメモリを占有しないため、このオプションはメモリのオーバーヘッドを大幅に削減します。
m := make(map[string]struct{}) m["aaa"] = struct{}{} m["bbb"] = struct{}{} m["bbb"] = struct{}{} // Ignored as "bbb" already exists m["ccc"] = struct{}{}
存在を確認する方法
要素がセット内に存在するかどうかを確認するには、 bool のゼロ値または構造体を使用したカンマ OK イディオムを活用できます。アプローチ:
オプション 1:
exists := m["somevalue"] // If "somevalue" is in the map, exists is true; otherwise, false
オプション 2:
_, exists := m["somevalue"] // exists is true if "somevalue" is in the map; false otherwise
順序の保持
広告掲載オーダーの維持が最も重要なのは、順序を保持するためのスライスと一意性の検証のためのマップを組み合わせて使用することを検討してください。ヘルパー関数の例:
func add(s string) { if m[s] { return // Already in the map } a = append(a, s) m[s] = true }
このアプローチを採用すると、一意の文字列の順序付きセットを作成できます。
以上がGo で一意の文字列の配列を効率的に維持するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。