在 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中文網其他相關文章!