go語(yǔ)法入門(mén)泛型type?parameters簡(jiǎn)稱(chēng)T(類(lèi)型形參)兩種場(chǎng)景使用
一、介紹
go在1.18終于加上了泛型。那么在之前,我們都沒(méi)有用10幾年了,一直用。
加上泛型后,到底好處在哪里呢,解決了那些場(chǎng)景的痛點(diǎn)呢?
泛型主要在于歸納,泛型-代表可以多余一種類(lèi)型。
作為入門(mén)的文章,主要介紹兩種泛型的使用場(chǎng)景
泛型允許在函數(shù)和類(lèi)型的實(shí)現(xiàn)中使用某個(gè)類(lèi)型集合中的任何一種類(lèi)型。
目前 “類(lèi)型形參” (type parameters),簡(jiǎn)稱(chēng) T
- 面向函數(shù),作為參數(shù)
- 面向結(jié)構(gòu)體,作為結(jié)構(gòu)體里面字段的類(lèi)型
1.1 面向函數(shù),作為參數(shù)
我們來(lái)看一下,在比較兩個(gè)數(shù)的大小時(shí),沒(méi)有泛型的時(shí)候,僅僅只是傳入類(lèi)型不一樣,我們就要再寫(xiě)一份一模一樣的函數(shù)。
// maxInt64 獲取j,j中的最大值 func maxInt64(i, j int64) int64 { if i >= j { return i } return j } // maxInt32 獲取j,j中的最大值 func maxInt32(i, j int32) int32 { if i >= j { return i } return j }
此時(shí)代碼的邏輯一樣,只是類(lèi)型不一樣,我們可以使用“類(lèi)型形參” (type parameters),簡(jiǎn)稱(chēng) T
來(lái)代表int32
或者int64
。
類(lèi)型形參type parameters簡(jiǎn)稱(chēng)T
語(yǔ)法為:
[T int32 | int64]
這樣的語(yǔ)法,我們用 類(lèi)型形參T
來(lái)代表int32
或者int64
類(lèi)型。
上面的
maxInt64(i, j int64) int64 maxInt32(i, j int32) int32
我們使用 類(lèi)型形參T
來(lái)替換為:
func maxInt32orInt62[T int32 | int64](i, j T) T { if i >= j { return i } return j } func TestMaxInt32orInt62(t *testing.T) { var i1, j1 int32 = 1, 3 t.Log(maxInt32orInt62(i1, j1)) var i2, j2 int64 = 11, 3 t.Log(maxInt32orInt62(i2, j2)) }
輸出:
=== RUN TestMaxInt32orInt62
3
11
--- PASS: TestMaxInt32orInt62 (0.00s)
在參數(shù)方面 i, j的類(lèi)型變?yōu)?code>T,以及返回值的類(lèi)型也是 T
因?yàn)槲颐丛谇懊娑x了
[T int32 | int64]
用T來(lái)代表int32
或者int64
.
1.2 面向結(jié)構(gòu)體,作為結(jié)構(gòu)體里面字段的類(lèi)型
我們先看一下正常結(jié)構(gòu)體的寫(xiě)法如下:
type sumInt struct { Num int64 } func (s sumInt) Sum() int64 { return s.Num } type sumFloat struct { Num float64 } func (s sumFloat) Sum() float64 { return s.Num } func TestSumIntOrFloat(t *testing.T) { i := sumInt{Num: 100} t.Log(i.Sum()) f := sumFloat{Num: 100.0} t.Log(f.Sum()) }
輸出:
=== RUN TestSumIntOrFloat
100
100
--- PASS: TestSumIntOrFloat (0.00s)
我們發(fā)現(xiàn)Num的類(lèi)型為int64
或float64
,我們?cè)谶@里準(zhǔn)備用“類(lèi)型形參” (type parameters),簡(jiǎn)稱(chēng) T
來(lái)代替他們。
[T int64 | float64]
修改為如下:
type sumIntOrFloat[T int64 | float64] struct { Num T } func (s sumIntOrFloat[T]) Sum() T { return s.Num } func TestSumIntOrFloat(t *testing.T) { i := sumIntOrFloat[int64]{Num: 100} t.Log(i.Sum()) f := sumIntOrFloat[float64]{Num: 100.0} t.Log(f.Sum()) }
輸出:
=== RUN TestSumIntOrFloat
100
100
--- PASS: TestSumIntOrFloat (0.00s)
以上就是go語(yǔ)法入門(mén)泛型type parameters簡(jiǎn)稱(chēng)T(類(lèi)型形參)兩種場(chǎng)景使用的詳細(xì)內(nèi)容,更多關(guān)于go泛型type parameters的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
go?分布式鎖簡(jiǎn)單實(shí)現(xiàn)實(shí)例詳解
這篇文章主要為大家介紹了go?分布式鎖簡(jiǎn)單實(shí)現(xiàn)實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09Go語(yǔ)言學(xué)習(xí)筆記之golang操作MongoDB數(shù)據(jù)庫(kù)
MongoDB是Nosql中常用的一種數(shù)據(jù)庫(kù),這篇文章主要給大家介紹了關(guān)于Go語(yǔ)言學(xué)習(xí)筆記之golang操作MongoDB數(shù)據(jù)庫(kù)的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-05-05Golang中如何對(duì)MySQL進(jìn)行操作詳解
這篇文章主要給大家介紹了關(guān)于在Golang中如何對(duì)MySQL進(jìn)行操作的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者使用Golang具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03Golang實(shí)現(xiàn)Md5校驗(yàn)的代碼示例
最近項(xiàng)目中有個(gè)需求,就是地圖文件下發(fā)后,接收方需要文件的md5值,和接收到的文件做比對(duì),以免文件不完整,引起bug,于是測(cè)試了下本地文件和遠(yuǎn)程文件的md5計(jì)算,所以本文給大家介紹了Golang實(shí)現(xiàn)Md5校驗(yàn),需要的朋友可以參考下2024-07-07Go實(shí)現(xiàn)基于RSA加密算法的接口鑒權(quán)
這篇文章主要介紹了Go實(shí)現(xiàn)基于RSA加密算法的接口鑒權(quán),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-06-06Golang中類(lèi)型轉(zhuǎn)換利器cast庫(kù)的用法詳解
cast庫(kù)是一個(gè)簡(jiǎn)潔而強(qiáng)大的第三方庫(kù),它的主要功能是實(shí)現(xiàn)類(lèi)型之間的安全轉(zhuǎn)換,而在Golang開(kāi)發(fā)中,類(lèi)型轉(zhuǎn)換是一個(gè)常見(jiàn)且不可避免的過(guò)程,下面我們就來(lái)看看cast庫(kù)在Golang中的具體應(yīng)用吧2024-11-11Go語(yǔ)言 channel如何實(shí)現(xiàn)歸并排序中的merge函數(shù)詳解
這篇文章主要給大家介紹了關(guān)于Go語(yǔ)言 channel如何實(shí)現(xiàn)歸并排序中merge函數(shù)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2018-02-02GoRoutines高性能同時(shí)進(jìn)行多個(gè)Api調(diào)用實(shí)現(xiàn)
這篇文章主要為大家介紹了GoRoutines高性能同時(shí)進(jìn)行多個(gè)Api調(diào)用實(shí)現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03