在切片中搜索元素通常会涉及迭代循环。但是,还有其他方法可以优化此过程。
虽然 Go 没有提供内置的 slice.contains() 方法,但创建一个相对简单。您可以定义如下函数:
func Contains[T comparable](s []T, v T) bool { for _, item := range s { if item == v { return true } } return false }
对于较大的切片,请考虑使用排序包中的二分搜索算法。它检查中间元素并根据结果递归地缩小搜索范围,从而使排序切片具有更好的性能:
func BinaryContains[T comparable](s []T, v T) bool { i := sort.Search(len(s), func(i int) bool { return s[i] >= v }) return i < len(s) && s[i] == v }
如果您经常对切片执行 contains 检查,请考虑使用地图。 Go 中的映射提供高效的键值查找。通过使用空 struct{} 作为值类型,您可以创建一个有效充当集合的映射:
type Set[T comparable] map[T]struct{} func NewSet[T comparable]() *Set[T] { return new(Set[T]) } func (s *Set[T]) Add(v T) { (*s)[v] = struct{}{} } func (s *Set[T]) Contains(v T) bool { _, ok := (*s)[v] return ok }
通过利用映射或优化切片搜索,您可以有效地检查 Go 中的元素是否存在切片。
以上是如何高效查找Go切片中的元素?的详细内容。更多信息请关注PHP中文网其他相关文章!