確定切片是否包含特定元素是編程中的常見任務。然而,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中文網其他相關文章!