可以實作通用程式碼來判斷 Go 切片中是否存在元素嗎?
在 Go 中,判斷切片是否包含特定元素是一個共同操作。然而,對於每種新的切片類型,實作此邏輯似乎很乏味。
一種嘗試的解決方案涉及使用interface{} 切片,如程式碼片段所示:
<code class="go">func sliceContains(slice []interface{}, elem interface{}) bool { for _, item := range slice { if item == elem { return true } } return false }</code>
但是,這種方法受到interface{}的性質以及每個新切片類型實現它的要求的阻礙。
幸運的是,Go的反射包提供了一個通用的解:
<code class="go">func Contains(slice, elem interface{}) bool { sv := reflect.ValueOf(slice) // Check slice type. if sv.Kind() != reflect.Slice && sv.Kind() != reflect.Array { return false } // Iterate slice and compare elements. for i := 0; i < sv.Len(); i++ { if elem == sv.Index(i).Interface() { return true } } // Element not found. return false }</code>
這個函數有兩個參數:切片和要尋找的元素。它使用反射來確定切片是切片還是數組,然後使用 ValueOf() 和 Index() 方法迭代其元素。
雖然這種通用方法很方便,但其代價是表現。基準測試顯示,它可能比非通用版本慢50-60 倍,如下所示:
<code class="go">func ContainsNonGeneic(slice []int, elem int) bool { for _, i := range slice { if i == elem { return true } } return false }</code>
基準測試結果:
以上是Go 的反射包可以啟用切片中的通用元素存在檢查嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!