偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

Go 語(yǔ)言泛型使用詳解

開(kāi)發(fā) 前端
本文我們回顧了 Go v1.18 引入的泛型的語(yǔ)法和使用方式,截止目前,雖然 Go 已經(jīng)迭代了 5 個(gè)版本,泛型仍然未得到廣泛使用。

1.介紹

Go v1.18 開(kāi)始支持泛型,距離 Go 當(dāng)前版本 v1.23 已經(jīng)迭代了 5 個(gè)大版本了。讀者朋友們?cè)谑褂?Go 語(yǔ)言開(kāi)發(fā)時(shí),是否已經(jīng)習(xí)慣使用泛型了呢?

本文我們一起再來(lái)回顧學(xué)習(xí)一下 Go 語(yǔ)言中的泛型。

2.概念和語(yǔ)法

概念

Go 語(yǔ)言引入泛型,主要目的是減少代碼重復(fù),提高類(lèi)型安全。泛型是指在定義函數(shù)(方法)、類(lèi)型或數(shù)據(jù)結(jié)構(gòu)時(shí),使用類(lèi)型參數(shù)來(lái)表示具體的類(lèi)型,從而提高代碼的靈活性和可用性。

所謂靈活性,即不需要為每種類(lèi)型編寫(xiě)相似代碼。所謂可用性,即在編譯時(shí)檢查類(lèi)型,避免運(yùn)行時(shí)錯(cuò)誤。

語(yǔ)法

所謂類(lèi)型參數(shù),即類(lèi)型本身也可以作為一種參數(shù)。在函數(shù)(方法)或類(lèi)型中,可以使用類(lèi)型參數(shù)定義通用類(lèi)型,使用方括號(hào) [] 包含任意合法的標(biāo)識(shí)符。

示例代碼:

[T int|string]

閱讀上面這段代碼,T 是類(lèi)型參數(shù)的形式參數(shù),int、string 是類(lèi)型參數(shù)的類(lèi)型約束。

所謂類(lèi)型約束,實(shí)際上是一個(gè) interface{},通??梢允÷?,但是,如果類(lèi)型約束特別多時(shí),也可以先定義類(lèi)型集,再使用,并且可以復(fù)用。

示例代碼:

// 定義
type MyType interface{
    int|int8|int32|int64|float32|float64
}

// 使用
[T MyType]

閱讀上面這段代碼,與以往不同, interface{} 中不再是函數(shù)集,而是類(lèi)型集。也就是說(shuō),在 Go v1.18 開(kāi)始,interface{} 不僅可以定義函數(shù)集,也可以定義類(lèi)型集。

需要注意的是,Go v1.18 開(kāi)始,interface{} 不僅可以包含任意類(lèi)型,還可以包含任意類(lèi)型集,或共享相同底層類(lèi)型的所有類(lèi)型。

示例代碼:

type A interface{
    int|float64
}

type B interface{
    string|bool
}

type C interface{
    A|B
}

type MyString ~string

閱讀上面這段代碼,~string 代表 string 類(lèi)型本身,和以 string 類(lèi)型為底層類(lèi)型的所有類(lèi)型。

3.使用方式

在了解完泛型的概念和語(yǔ)法之后,接下來(lái),我們介紹泛型的使用方式。

泛型類(lèi)型

切片 slice 示例代碼:

type Sl [T int|float64] []T

映射 map 示例代碼:

type M [K string|int, V string|int] map[K]V

閱讀上面這段代碼,[] 中包含多個(gè)類(lèi)型參數(shù),需要使用英文逗號(hào) , 分隔,并且類(lèi)型參數(shù)的形式參數(shù)名字不能相同。

結(jié)構(gòu)體 struct 示例代碼:

type St [T int|string] struct {
    id     int
    name   string
    salary T
}

需要注意的是,以上所有泛型類(lèi)型,在使用的時(shí)候,需要顯式指定類(lèi)型的實(shí)參(類(lèi)型約束),因?yàn)樗恢С诸?lèi)型推斷。

以結(jié)構(gòu)體 struct 為例,示例代碼:

coder := &St[int]{
    id:     1,
    name:   "frank",
    salary: 1000,
}
fmt.Printf("%+v\n", coder)

泛型方法

接下來(lái),我們介紹泛型類(lèi)型的泛型方法,示例代碼:

type Salary[T int|float64] struct {
    X,Y T
}

func (s *Salary[T]) Min(x, y T) T {
    if x < y {
        return x
    }
    return y
}

// 顯式指定類(lèi)型參數(shù)的實(shí)際參數(shù)(類(lèi)型約束),不支持類(lèi)型推斷
sa := &Salary[int] {
    X: 1000,
    Y: 2000,
}
value := sa.Min(sa.X, sa.Y)
fmt.Println(value)

需要注意的是,泛型方法的入?yún)⒉恢С肿远x類(lèi)型參數(shù),示例代碼:

func (s *Salary[T]) Min[T1 int32|float32](x, y T1) T {
    if x < y {
        return x
    }
    return y
}

閱讀上面這段代碼,泛型方法的入?yún)?,自定義了類(lèi)型參數(shù) Min[T1 int32|float32](x, y T1),目前是不支持。

泛型函數(shù)

接下來(lái),我們介紹泛型函數(shù)的使用方式,示例代碼:

func MinNumber[T int|float64](x, y T) T {
    if x < y {
        return x
    }
    return y
}

r := MinNumber[int](1, 2)

閱讀上面這段代碼,我們使用類(lèi)型參數(shù)定義的函數(shù),就是泛型函數(shù)。需要注意的是,在使用函數(shù)時(shí),我們顯式指定函數(shù)入?yún)⒌念?lèi)型 r := MinNumber[int](1, 2),實(shí)際上,可以通過(guò)類(lèi)型推斷,通過(guò)函數(shù)的入?yún)⑼茢喾盒偷膶?shí)際類(lèi)型。即 r := MinNumber(1, 2)。

需要注意是,泛型函數(shù)的類(lèi)型推斷,僅支持函數(shù)的入?yún)?,函?shù)的返回結(jié)果和函數(shù)體是不支持的。

4.總結(jié)

本文我們回顧了 Go v1.18 引入的泛型的語(yǔ)法和使用方式,截止目前,雖然 Go 已經(jīng)迭代了 5 個(gè)版本,泛型仍然未得到廣泛使用。

在 Go 未推出泛型之前,Go 社區(qū)的呼聲很大,Go 引入泛型之后,未能得到廣泛使用的原因是一些三方庫(kù)和框架,為了追求穩(wěn)定,不愿意大改代碼。

其次,泛型雖然優(yōu)勢(shì)明顯,同時(shí)也帶來(lái)的 Go 語(yǔ)法的復(fù)雜性,這一點(diǎn)有悖于 Go 推崇的使用簡(jiǎn)單。

對(duì)此我的看法是,建議讀者朋友們積極學(xué)習(xí)和使用泛型,老項(xiàng)目如果不愿意重構(gòu),建議新項(xiàng)目開(kāi)始使用泛型。

責(zé)任編輯:武曉燕 來(lái)源: Golang語(yǔ)言開(kāi)發(fā)棧
相關(guān)推薦

2021-09-29 18:17:30

Go泛型語(yǔ)言

2022-03-28 13:34:26

Go泛型部署泛型

2021-10-18 10:53:26

Go 代碼技術(shù)

2021-12-13 08:52:42

Go 泛型

2021-01-14 05:20:48

Go語(yǔ)言泛型

2022-04-15 09:55:59

Go 泛型Go 程序函數(shù)

2022-03-18 18:00:00

編程語(yǔ)言泛型支持模糊測(cè)試

2021-06-18 08:25:42

Java泛型通配符

2021-11-27 22:20:13

SlicesGo泛型

2023-11-03 14:02:04

Go切片泛型庫(kù)

2023-11-29 08:19:45

Go泛型缺陷

2011-04-13 09:16:55

泛型

2022-05-06 09:22:25

Go泛型

2021-12-15 10:23:56

Go 1.18 Bet語(yǔ)言泛型

2021-12-05 23:45:23

Go泛型Maps

2009-07-30 14:00:21

ASP.NET 2.0

2011-03-21 16:26:28

java泛型

2021-06-17 06:51:32

Java泛型Java編程

2023-09-15 21:05:19

Go語(yǔ)言參數(shù)化

2022-03-29 11:48:40

Go泛型測(cè)試
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)