在切片中搜尋元素通常會涉及迭代循環。但是,還有其他方法可以優化此過程。
雖然 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中文網其他相關文章!