首頁  >  文章  >  後端開發  >  如何檢查 Go 中不同類型切片中是否存在元素?

如何檢查 Go 中不同類型切片中是否存在元素?

Linda Hamilton
Linda Hamilton原創
2024-11-02 03:11:30275瀏覽

How do you check for element presence in slices of different types in Go?

如何在 Go 中一般檢查切片中是否存在元素

在 Go 中,確定切片是否包含特定元素可以是常見場景。但是,沒有內建方法可以跨不同切片類型執行此通用檢查。

介面嘗試失敗{}

嘗試使用介面{ } type 作為通用解決方案,如下所示,似乎是合理的:

<code class="go">func sliceContains(slice []interface{}, elem interface{}) bool {
    for _, item := range slice {
       if item == elem {
          return true
       }
    }
    return false
}</code>

但是,比較不同類型(interface{})的值可能會導致不正確的結果。

使用反射的通用解決方案

要實現真正通用的解決方案,可以採用反射。以下函數使用反射來迭代切片並將每個元素與目標元素進行比較:

<code class="go">func Contains(slice, elem interface{}) bool {

    sv := reflect.ValueOf(slice)

    // Check that slice is actually a slice/array.
    if sv.Kind() != reflect.Slice && sv.Kind() != reflect.Array {
        return false
    }

    // Iterate the slice
    for i := 0; i < sv.Len(); i++ {

        // Compare elem to the current slice element
        if elem == sv.Index(i).Interface() {
            return true
        }
    }

    // Nothing found
    return false
}</code>

此解決方案可讓您對任何類型的切片執行通用元素檢查。

效能注意事項

雖然通用 Contains 函數提供了所需的功能,但它會帶來顯著的效能成本。針對非通用等效函數進行基準測試會產生約 50 倍的減速因子。因此,在使用反射進行通用元素檢查之前評估性能影響至關重要。

以上是如何檢查 Go 中不同類型切片中是否存在元素?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn