首頁 > 後端開發 > Golang > 接受通道和切片的通用函數

接受通道和切片的通用函數

PHPz
發布: 2024-02-06 08:36:10
轉載
818 人瀏覽過

接受通道和切片的通用函數

問題內容

我正在嘗試在 golang 中編寫通用函數,該函數將以類似的方式在切片和通道中搜尋值。這是一個例子:

// minof returns the smallest number found among the channel / slice contents
func minof[t chan int | []int](input t) (result int) {
    for _, value := range input {
        if result > value {
            result = value
        }
    }

    return
}
登入後複製

但我收到以下編譯錯誤:cannot range over input(類型 t 的變數受 chan int|[]int 約束)(t 沒有核心型別)

我嘗試建立通用介面,如下所示:

type Rangable interface {
    chan int | []int
}

// MinOf returns the smallest number found among the channel / slice contents
func MinOf[T Rangable](input T) (result int) {
    for _, value := range input {
        if result > value {
            result = value
        }
    }

    return
}
登入後複製

雖然,錯誤已更改為 cannot range over input(t 類型的變數受 rangable 約束)(t 沒有核心類型) 它基本上保持不變...

有什麼方法可以使用泛型或通道來解決此任務,而切片無法「轉換」為相同的核心類型嗎?

感謝您的任何建議和想法!


正確答案


你不能這樣做。

range 表達式必須具有一個核心型別開始。具有不同類型術語的聯合沒有核心類型,因為沒有一個共同的基礎類型。

你也可以直觀地看出為什麼 range 需要一個核心類型:切片和通道範圍的語意是不同的。

  1. 在通道上進行測距可能是阻塞操作,在切片上進行測距則不是

  2. 迭代變數不同

for i, item := range someslice {}
登入後複製

對於切片,iint 類型的索引,item 是切片元素的類型。

for item := range somechan {}
登入後複製

對於通道,item 是 chan 元素的類型,而這是唯一可能的範圍變數。

你能擁有的最好的就是類型開關:

func MinOf[T any, U chan T | []T](input U) (result int) {
    switch t := any(input).(type) {
    case chan T:
        // range over chan
    case []T:
        // range over slice
    }
    return
}
登入後複製

但同樣,函數的行為(阻塞與非阻塞)取決於類型,並且不清楚在這裡使用泛型可以獲得什麼優勢。

以上是接受通道和切片的通用函數的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:stackoverflow.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板