我正在嘗試在 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
需要一個核心類型:切片和通道範圍的語意是不同的。
在通道上進行測距可能是阻塞操作,在切片上進行測距則不是
迭代變數不同
for i, item := range someslice {}
對於切片,i
是 int
類型的索引,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中文網其他相關文章!