首頁 >後端開發 >Golang >如何在 Go 泛型函數中迭代切片並集?

如何在 Go 泛型函數中迭代切片並集?

Linda Hamilton
Linda Hamilton原創
2025-01-05 05:31:08257瀏覽

How to Iterate Over a Union of Slices in Go Generic Functions?

在泛型函數中迭代切片聯合

Go 中的泛型允許函數對一系列類型進行操作,從而實現程式碼重用和類型安全。但是,在處理不同元素類型的切片時,在泛型函數中迭代它們時可能會遇到挑戰。

考慮以下範例,此範例旨在對切片的元素求和,可能包含整數或浮點數:

package main

import "fmt"

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

func add[N NumberSlice](n N) {
    // want: to range over n and print value of v
    for _, v := range n {
        fmt.Println(v)
    }
}

func main() {
    ints := []int64{1, 2}
    add(ints)
}

執行此程式碼時,出現以下錯誤:

cannot range over n (variable of type N constrained by NumberSlice) (N has no core type)

問題在於缺少NumberSlice 介面限制的「核心類型」。核心類型表示由介面類型集中的所有類型共享的單一基礎類型。由於 NumberSlice 同時包含 []int64 和 []float64,因此它沒有核心型別。

要解決此問題,有以下幾種方法:

  1. 強制執行通用基本類型:
    修改介面約束以指定基本類型並規定其中的切片類型函數簽章:

    type Number interface {
        int64 | float64
    }
    
    func add[N Number](n []N) {
        for _, v := range n {
            fmt.Println(v)
        }
    }
  2. 使用具有顯式類型的泛型:
    聲明指定元素類型的泛型切片類型並使用明確類型來指示所需的元素類型:

    type NumberSlice[N int64 | float64] interface {
        ~[]N // indicates a core type of []N
    }
    
    func add[S NumberSlice[N], N int64 | float64](n S) {
        for _, v := range n {
            fmt.Println(v)
        }
    }

透過指定核心類型,編譯器可以推斷適當的迭代行為,從而實現在泛型函數內迭代切片的所需操作。

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

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