ホームページ >バックエンド開発 >Golang >Go でスライス要素の存在を一般的に確認するにはどうすればよいですか?

Go でスライス要素の存在を一般的に確認するにはどうすればよいですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-10-28 20:00:29910ブラウズ

How Can I Check for Slice Element Presence in Go Generically?

Go でのスライス要素の存在の一般的なチェック

スライスに特定の要素が含まれているかどうかを判断することは、プログラミングにおける一般的なタスクです。ただし、Go プログラミング言語には、この目的のための組み込み関数がありません。

1 つの方法は、次のインターフェース タイプを使用することです。

<code class="go">func sliceContains(slice []interface{}, elem interface{}) bool {
    for _, item := range slice {
       if item == elem {
          return true
       }
    }
    return false
}</code>

ただし、この方法ではコードを手動で記述する必要があります。

汎用ソリューションにリフレクションを使用する

幸いなことに、Go のリフレクション パッケージでは、任意のスライス タイプを処理できる汎用コードが可能です。

<code class="go">func Contains(slice, elem interface{}) bool {

    sv := reflect.ValueOf(slice)

    // Check if slice is valid
    if sv.Kind() != reflect.Slice && sv.Kind() != reflect.Array {
        return false
    }

    // Iterate over slice elements
    for i := 0; i < sv.Len(); i++ {
        if elem == sv.Index(i).Interface() {
            return true
        }
    }

    // Element not found
    return false
}</code>

パフォーマンスに関する考慮事項

リフレクションベースのアプローチは汎用的ですが、型固有の非汎用関数と比較すると、パフォーマンスに重大な影響を及ぼします。ベンチマークでは 50 ~ 60 倍の速度低下が示されています。

Generic: 730.23214 ns/op
Non-Generic: 13.15262 ns/op

結論

リフレクションはスライス要素チェック用の汎用コードを作成する方法を提供しますが、パフォーマンスのトレードオフを慎重に比較検討することが重要です。 。パフォーマンスが重要なシナリオでは、型固有の非ジェネリック関数を強くお勧めします。

以上がGo でスライス要素の存在を一般的に確認するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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