首頁 >後端開發 >Golang >如何迭代通用函數中傳遞的切片並集? (T無芯型)

如何迭代通用函數中傳遞的切片並集? (T無芯型)

WBOY
WBOY轉載
2024-02-06 08:50:08372瀏覽

如何迭代通用函数中传递的切片并集? (T无芯型)

問題內容

我正在 go 1.18 中測試泛型並查看了這個範例。 我想重新建立該範例,但能夠傳入 int 切片或 float 切片,並且在函數中我將總結切片中的所有內容。

這是我在迭代切片時遇到一些問題的時候。這是我嘗試過的:

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)

我該如何達成這個目標?


正確答案


介面(包含介面約束)的核心類型定義如下:

如果滿足下列條件之一,則介面 t 具有核心類型: 滿意:

  • 存在單一類型u,它是t類型集中所有類型的底層類型

  • 或t的類型集只包含具有相同元素類型e的通道類型,並且所有有向通道具有相同的方向。

您的介面約束沒有核心類型,因為它有兩個底層類型:[]int64[]float64

因此您不能在需要核心類型的地方使用它。特別是 rangemake

您可以變更介面以要求基本類型,然後在函數簽章中指定切片:

// still no core type...
type number interface {
    int64 | float64
}

// ...but the argument will be instantiated with either int64 or float64
func add[n number](n []n) {
    for _, v := range n {
        fmt.println(v)
    }
}

這也有效,但更冗長:

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

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

以上是如何迭代通用函數中傳遞的切片並集? (T無芯型)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除