亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何迭代在泛型函數中傳遞的切片聯合?(T沒有核心類型)

如何迭代在泛型函數中傳遞的切片聯合?(T沒有核心類型)

Go
qq_笑_17 2022-11-23 15:53:28
我正在 go 1.18 中測試泛型并查看了這個示例。我想重新創建該示例,但改為能夠傳入一片 int 或一片浮點數,而在函數中,我將對片中的所有內容求和。這是我在迭代切片時遇到的一些問題。這是我試過的:package mainimport "fmt"// NumberSlice constrainttype 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)}我得到了錯誤:不能超過 n(N 類型的變量受 NumberSlice 約束)(N 沒有核心類型)我該如何做到這一點?
查看完整描述

2 回答

?
慕村225694

TA貢獻1880條經驗 獲得超4個贊

接口(包括接口約束)的核心類型定義如下:

如果滿足以下條件之一,則接口 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)

    }

}


查看完整回答
反對 回復 2022-11-23
?
森欄

TA貢獻1810條經驗 獲得超5個贊

這樣的事情對你有用嗎?


package main


import "fmt"


type NumberOrFloat interface {

    int64 | float64

}


func add[N NumberOrFloat](n []N) {

    for _, v := range n {

        fmt.Println(v)

    }

}


func main() {

    ints := []int64{1, 2}

    add(ints)

}

這里的區別在于你定義了數組元素的類型約束(而不是數組類型):[]N


查看完整回答
反對 回復 2022-11-23
  • 2 回答
  • 0 關注
  • 98 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號