go 泛型

go 泛型

1. 類型參數(shù)(Type parameters)

Go語言的泛型(Generic)叫做類型參數(shù)刀荒。泛型可以讓我們代碼適應不同類型的參數(shù)哀澈。

泛型函數(shù)

聲明語法

// 聲明一個帶有泛型的函數(shù)
// T 指類型參數(shù)础钠,就是一個參數(shù),代表類型
// Constraint 是對類型參數(shù)T的約束叫胖,限制T的取值, 可以是int棺蛛、string、any等類型巩步,any可以是任意類型的意思
// s 是要打印的參數(shù)
func name[T {Constraint}](s T) {}

函數(shù)名和函數(shù)參數(shù)列表之間插入了一組方括號旁赊,來表示類型參數(shù)。跟函數(shù)參數(shù)一樣椅野,我們需要為每一個類型參數(shù)指定「類型」终畅,這種類型的類型Go語言稱之為約束。

示例

// 打印函數(shù)
func print[T any](s ...T) {
    for _, i := range s {
        fmt.Println(i)
    }
}

T表是切片成員的類型竟闪,但T的實際類型在定義print()的時候是不確定的离福,需要在調(diào)用該函數(shù)的時候指明。也就是說炼蛤,我們在調(diào)用print()函數(shù)的時候需要額外傳入一個特殊參數(shù)來指定T的具體類型妖爷。這種特殊的參數(shù)就叫類型參數(shù)。

使用泛型函數(shù)

func main() {
    // 約束為int類型
    print[int](1, 3, 4) 
    
    // 約束為string類型
    print[string]("derek", "阿瓦達啃大瓜", "奇摩雞")
    
    // 任意類型
    print[any](1, "wo")
    
    // 任意類型理朋,與any一樣
    print[interface{}](1, "wo")
    
    // 不指定約束類型絮识,則輸入的數(shù)據(jù)類型必須為同一種類型
    print(1, 3, 4)
}

指定出參類型

// 指定返回參數(shù)的類型是T
func add[T any](a, b T) T {
    return a + b
}

// 也可以返回指針
func addV2[T any](a T) *T {
    return &a 
}

func main() {
    // 約束為int類型
    add[int](1, 3, 4) 
    
    // 約束為string類型
    add[string]("derek", "阿瓦達啃大瓜")  
}

// 結果輸出:
// 8
// derek阿瓦達啃大瓜

泛型類型

// 定義一個泛型的數(shù)組
type Nums[T any] []T

// 定義一個泛型的map, map的K比較特殊嗽上,必須使用comparable來約束, 否則不生效
type Map[K comparable, V any] map[K]V

2. 內(nèi)置約束 comparable

泛型參數(shù)一般都可以進行運算操作次舌,但有兩個符號是特殊的,就是:== 和 !=兽愤。 如果參數(shù)需要使用這兩個作比較彼念,則一定要使用comparable。

// 比較兩個參數(shù)t浅萧、v是否相等
func Comp[T comparable](s []T, v T) int {
    for i, t := range s {
        if t == v {
            return i
        }
    }
    return 0
}

如果把上述的comparable改為any逐沙,則會報錯:

invalid operation: t == v (type parameter T is not comparable with ==)

map數(shù)據(jù)的key有需要使用comparable,否則也會報錯

3.自定義約束 (Constraint)

泛型的Constraint惯殊,可以使用any酱吝、int、string土思、comparable都可以务热,還可以定義一個interface來定義約束

// Addable 泛型操作
type Addable interface {
    // 約束類型
    ~int | float32 | ~float64 | string
}

func add[T Addable](a, b T) T {
    return a + b
}

上述的"~"符號不是必須的,但加上"~"的話己儒,系統(tǒng)會兼容基類參數(shù)類型崎岂。例如,這里定義了一個類型Int

type Int int

int就是Int的基類類型闪湾,如果是這時候Addable的是~int冲甘,則Int會在其約束范圍內(nèi),否則不在約束范圍內(nèi)。

并集約束

取約束類型的并集江醇,intfloat32都是約束

type Addable interface {
    int | float32 
}

交集約束

type Stringer interface {
    String() string
}

type Addable interface {
    int
    Stringer
}

這種情況下濒憋,Addable約束的類型,必須是int類型陶夜,且這個類型實現(xiàn) Stringer 接口凛驮。

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市条辟,隨后出現(xiàn)的幾起案子黔夭,更是在濱河造成了極大的恐慌,老刑警劉巖羽嫡,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件本姥,死亡現(xiàn)場離奇詭異,居然都是意外死亡杭棵,警方通過查閱死者的電腦和手機婚惫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來颜屠,“玉大人辰妙,你說我怎么就攤上這事「撸” “怎么了?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵蛙婴,是天一觀的道長粗井。 經(jīng)常有香客問我,道長街图,這世上最難降的妖魔是什么浇衬? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮餐济,結果婚禮上耘擂,老公的妹妹穿的比我還像新娘。我一直安慰自己絮姆,他們只是感情好醉冤,可當我...
    茶點故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著篙悯,像睡著了一般蚁阳。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上鸽照,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天螺捐,我揣著相機與錄音,去河邊找鬼。 笑死定血,一個胖子當著我的面吹牛赔癌,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播澜沟,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼灾票,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了倔喂?” 一聲冷哼從身側響起铝条,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎席噩,沒想到半個月后班缰,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡悼枢,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年埠忘,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片馒索。...
    茶點故事閱讀 40,144評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡莹妒,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出绰上,到底是詐尸還是另有隱情旨怠,我是刑警寧澤,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布蜈块,位于F島的核電站鉴腻,受9級特大地震影響,放射性物質發(fā)生泄漏百揭。R本人自食惡果不足惜爽哎,卻給世界環(huán)境...
    茶點故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望器一。 院中可真熱鬧课锌,春花似錦、人聲如沸祈秕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽踢步。三九已至癣亚,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間获印,已是汗流浹背述雾。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工街州, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人玻孟。 一個月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓唆缴,卻偏偏與公主長得像,于是被迫代替她去往敵國和親黍翎。 傳聞我的和親對象是個殘疾皇子面徽,可洞房花燭夜當晚...
    茶點故事閱讀 45,092評論 2 355

推薦閱讀更多精彩內(nèi)容