确定切片是否包含特定元素是编程中的常见任务。然而,Go 编程语言缺乏用于此目的的内置函数。
一种方法是使用 interface{} 类型:
<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中文网其他相关文章!