Go泛型透過引入類型參數化改變了函數類型推斷:參數類型:[]A,其中A是滿足number介面的實際類型參數,在呼叫時具體化。傳回值類型:與參數類型相同,推斷為A。
Go 泛型如何影響函數型別推論
Go 語言中的泛型引進了一個新的型別推斷機制,它影響函數類型推斷的方式。了解這些變化對於正確使用 Go 泛型非常重要。
傳統類型推斷
在 Go 泛型之前,函數類型推斷是基於上下文中的類型資訊。例如,以下函數:
func SumNumbers(numbers []int) int { sum := 0 for _, number := range numbers { sum += number } return sum }
會推斷 SumNumbers
的參數型別為 []int
,傳回值型別為 int
。這是因為range
語句中的number
變數具有型別int
,而sum
變數是類型的int
。
泛型中的型別推斷
Go 泛型引入了一層額外的型別參數化,這改變了函數型別推論的方式。考慮以下泛型函數:
func Sum[T number](numbers []T) T { sum := zero[T]() for _, number := range numbers { sum += number } return sum }
現在,Sum
函數具有一個類型參數T
,指示類型T
應該是數字類型,也是說,它必須實作number
介面。在這種情況下,函數類型推斷如下:
[]A
,其中A
是滿足number
接口的實際類型參數(在調用時具體化)。 A
,與函數參數類型相同。 實戰案例
以下是使用Sum
泛型函數的範例:
// 求和整型数组 sum := Sum([]int{1, 2, 3}) // 推断 T 为 int // 求和浮点型数组 sumF := Sum([]float64{1.2, 2.3, 3.4}) // 推断 T 为 float64
如你所看到的,Sum
泛型函數可以根據呼叫時的實際類型參數進行類型推斷。
以上是Golang泛型如何影響函數型別推論?的詳細內容。更多資訊請關注PHP中文網其他相關文章!