Go でスライスを扱うとき、スライス内に特定の要素が存在するかどうかを確認する必要が生じることがよくあります。このための組み込みメソッドはありませんが、リフレクションを使用して一般的な解決策を実現できます。リフレクションはオブジェクトを動的に操作する方法を提供しますが、パフォーマンスが犠牲になります。
reflect パッケージは、実行時にデータを検査および操作する方法を提供します。スライスの場合、reflect.ValueOf(slice) を使用して、スライスを表す Reflect.Value を取得できます。そこから、Kind() をチェックしてスライスかどうかを確認し、Len() と Index() を使用してその要素を反復処理します。
リフレクションを使用した一般的な解決策は次のとおりです。非汎用の同等のものよりもかなり遅い。特定の要素タイプを特別にチェックするカスタム関数を使用すると、パフォーマンスが大幅に向上します。
次のコードは、汎用の Contains() 関数と非汎用関数の実装を示しています。比較のための ContainsNonGeneric():
<code class="go">import "reflect" func Contains(slice, elem interface{}) bool { sv := reflect.ValueOf(slice) if sv.Kind() != reflect.Slice && sv.Kind() != reflect.Array { return false } for i := 0; i < sv.Len(); i++ { if elem == sv.Index(i).Interface() { return true } } return false } func ContainsNonGeneric(slice []int, elem int) bool { for _, i := range slice { if i == elem { return true } } return false } func main() { si := []int{3, 4, 5, 10, 11} ss := []string{"hello", "world", "foo", "bar"} fmt.Println(Contains(si, 3)) fmt.Println(Contains(si, 100)) fmt.Println(Contains(ss, "hello")) fmt.Println(Contains(ss, "baz")) }</code>
汎用 Contains() 関数は、あらゆるタイプのスライス内の要素の存在を確認する方法を提供しますが、パフォーマンスへの影響を考慮することが重要です。 。最適なパフォーマンスを得るには、可能な限り、特定の型チェックを備えたカスタム関数を使用する必要があります。
以上がGo スライス内の要素の存在を確認する方法: 汎用ソリューションと非汎用ソリューション?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。