go 1.18 引入了泛型函數(shù),支持類(lèi)型參數(shù)化,增強(qiáng)了代碼可重用性。泛型函數(shù)語(yǔ)法為 func 函數(shù)名[類(lèi)型參數(shù)] (輸入?yún)?shù) 類(lèi)型參數(shù)) 類(lèi)型參數(shù),可使用類(lèi)型參數(shù)化類(lèi)型作為輸入和返回類(lèi)型。如 min[t number] (a, b t) t,其中 t 必須為 numeric 類(lèi)型,a 和 b 為 t 類(lèi)型的輸入?yún)?shù),返回較小的數(shù)字。泛型函數(shù)極大地提高了代碼的可重用性,可編寫(xiě)通用代碼,適用于各種類(lèi)型。
Go 泛型的函數(shù)應(yīng)用
Go 1.18 及更高版本中引入的泛型使得函數(shù)可以接受和返回類(lèi)型參數(shù)化的類(lèi)型。這極大地增強(qiáng)了代碼的可重用性和靈活性。
語(yǔ)法
泛型函數(shù)的語(yǔ)法如下:
func myFunc[T any](input T) T { // ... }
登錄后復(fù)制
其中:
myFunc
是函數(shù)名稱(chēng)。T any
是類(lèi)型參數(shù)。它可以是任何類(lèi)型,包括自定義類(lèi)型。input
是帶有類(lèi)型參數(shù)化類(lèi)型的輸入?yún)?shù)。T
是帶有類(lèi)型參數(shù)化類(lèi)型的返回類(lèi)型。
實(shí)戰(zhàn)案例
假設(shè)我們想創(chuàng)建一個(gè)函數(shù)來(lái)計(jì)算兩個(gè)數(shù)字的最小值。泛型函數(shù)可以讓我們用任何數(shù)字類(lèi)型來(lái)表示這兩個(gè)數(shù)字,而無(wú)需創(chuàng)建多個(gè)具有特定類(lèi)型簽名的函數(shù)。
我們可以編寫(xiě)如下泛型函數(shù):
func Min[T number](a, b T) T { if a < b { return a } return b }
登錄后復(fù)制
其中:
T number
表示類(lèi)型參數(shù) T 必須是 numeric 類(lèi)型(例如 int、float64)。a
和 b
是輸入?yún)?shù),類(lèi)型為 T。if-else
語(yǔ)句比較兩個(gè)數(shù)字并返回較小的數(shù)字。
我們可以使用此函數(shù)來(lái)計(jì)算不同類(lèi)型數(shù)字的最小值:
var a int8 = 10 var b int16 = 20 min := Min(a, b) // 類(lèi)型推斷為 int16 fmt.Println(min) // 輸出:10
登錄后復(fù)制
結(jié)論
Go 泛型通過(guò)允許函數(shù)接受和返回類(lèi)型化類(lèi)型,極大地提高了代碼的可重用性和靈活性。通過(guò)使用泛型的函數(shù),我們可以編寫(xiě)通用代碼,適用于各種類(lèi)型。