スライスに特定の要素が含まれているかどうかを判断することは、プログラミングにおける一般的なタスクです。ただし、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 サイトの他の関連記事を参照してください。