首頁 >後端開發 >Golang >如何在沒有核心類型的情況下迭代 Go 泛型函數中的切片並集?

如何在沒有核心類型的情況下迭代 Go 泛型函數中的切片並集?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-12-23 15:23:10628瀏覽

How Can I Iterate Over a Union of Slices in a Go Generic Function Without a Core Type?

在沒有核心類型的泛型函數中迭代切片聯合

在Go 1.18 中,泛型函數允許我們使用類型動態地。然而,在迭代由不同類型組成的切片時遇到挑戰需要額外考慮。

在處理類型限制時,我們必須了解核心類型的概念。當介面中的所有類型都存在單一基礎類型或所有通道具有相同的元素類型和方向時,就存在核心類型。

在初始程式碼範例中:

type NumberSlice interface {
    []int64 | []float64
}

介面限制 NumberSlice 沒有核心類型,因為它包含多個基礎類型:[]int64 和 []float64。這意味著我們無法覆蓋此介面的切片。

為了克服這個障礙,我們可以修改介面以需要基本類型:

type Number interface {
    int64 | float64
}

func add[N Number](n []N) {
    for _, v := range n {
        fmt.Println(v)
    }
}

這允許我們聲明int64 或 float64 並在通用函數中迭代它們。

或者,我們可以定義一個帶有核心的更明確的介面type:

type NumberSlice[N int64 | float64] interface {
    ~[]N
}

func add[S NumberSlice[N], N int64 | float64](n S) {
    for _, v := range n {
        fmt.Println(v)
    }
}

此方法確保介面對於所有實作NumberSlice[N] 的類型具有已知的底層類型[]N。

透過進行這些調整,我們可以成功迭代泛型函數中的切片聯合,為我們的程式碼提供了更高的靈活性。

以上是如何在沒有核心類型的情況下迭代 Go 泛型函數中的切片並集?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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