ホームページ >バックエンド開発 >Golang >Go で一意の文字列の配列を効率的に維持するにはどうすればよいですか?

Go で一意の文字列の配列を効率的に維持するにはどうすればよいですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-19 06:41:20255ブラウズ

How to Efficiently Maintain an Array of Unique Strings in Go?

配列内の一意の文字列の維持

提供されたコードでは、一意の文字列の配列を作成することを目的としています。ただし、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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。