Go1.18都出泛型了速來(lái)圍觀
go泛型使用的官方說(shuō)明:https://go.dev/doc/tutorial/generics
在使用之前先把go更新到1.18或者以上的版本:https://go.dev/doc/install
如果用過(guò)c++或者Java的話,那么對(duì)泛型這個(gè)概念應(yīng)該是不陌生的。(下面這段定義摘抄自百度百科)
泛型程序設(shè)計(jì)(generic programming)是程序設(shè)計(jì)語(yǔ)言的一種風(fēng)格或范式。泛型允許程序員在強(qiáng)類型程序設(shè)計(jì)語(yǔ)言中編寫代碼時(shí)使用一些以后才指定的類型,在實(shí)例化時(shí)作為參數(shù)指明這些類型。
我們可以用個(gè)簡(jiǎn)單的例子來(lái)看看如何使用泛型。
在沒(méi)有泛型之前,如果我們要寫一個(gè)比較大小的函數(shù)的話,因?yàn)間o里面沒(méi)有函數(shù)重載的概念,所以我們必須對(duì)需要比較的類型都創(chuàng)建一個(gè)比較函數(shù),不過(guò)這樣的話,就會(huì)有大量邏輯重復(fù)的代碼,他們的區(qū)別只是變量的類型不同罷了。
package main import "fmt" func MaxInt(a, b int) int { if a > b { return a } else { return b } } func MaxFloat32(a, b float32) float32 { func main() { var a, b int var c, d float32 a = 1 b = 2 c = 1.1 d = 1.4 fmt.Println(MaxInt(a, b)) fmt.Println(MaxFloat32(c, d))
那么泛型該如何使用呢?
go預(yù)留了一個(gè)泛型,名為comparable
,這是官方定義的一個(gè)可比較的類型約束
// comparable is an interface that is implemented by all comparable types // (booleans, numbers, strings, pointers, channels, arrays of comparable types, // structs whose fields are all comparable types). // The comparable interface may only be used as a type parameter constraint, // not as the type of a variable. //翻譯如下 //comparable是由所有可比較類型實(shí)現(xiàn)的接口 //(布爾、數(shù)字、字符串、指針、通道、類似類型的數(shù)組、, //字段均為可比較類型的結(jié)構(gòu))。 //可比接口只能用作類型參數(shù)約束, //不是作為變量的類型。 type comparable interface{ comparable }
我們可以來(lái)自己聲明一個(gè)類型約束。
type Number interface { int | int32 | int64 | float32 }
如上定義表示如果參數(shù)類型要為int
、int32
、int64
、float32
這四個(gè)類型其中一個(gè)的適合,可以用Number替代。
所以我們可以把最初比較大小的代碼進(jìn)行修改、簡(jiǎn)化一下。
package main import "fmt" type Number interface { int | int32 | int64 | float32 } func MaxNumber[K Number](a K, b K) K { if a > b { return a } else { return b } func main() { var a, b int var c, d float32 a = 1 b = 2 c = 1.1 d = 1.4 fmt.Println(MaxNumber(a, b)) fmt.Println(MaxNumber(c, d))
在函數(shù)名后面用在中括號(hào)中使用類型約束,這時(shí)候在函數(shù)里面K
就表示Number這個(gè)類型約束,然后可以用在函數(shù)的參數(shù)列表、函數(shù)體、返回值中。
加入需要用到以int
或者float32
等基本類型為基礎(chǔ)的類型時(shí),例如type MyInt int
,需要在類型名前面加上~
type Number interface { ~int }
如果不加的話,使用時(shí)會(huì)出現(xiàn)如下錯(cuò)誤提示
# generics-demo
.\main.go:23:23: MyInt does not implement Number (possibly missing ~ for int in constraint Number)
到此這篇關(guān)于Go1.18都出泛型了,不來(lái)試試看?的文章就介紹到這了,更多相關(guān)Go1.18泛型內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Go利用反射reflect實(shí)現(xiàn)獲取接口變量信息
反射是通過(guò)實(shí)體對(duì)象獲取反射對(duì)象(Value、Type),然后可以操作相應(yīng)的方法。本文將利用Go語(yǔ)言中的反射reflect實(shí)現(xiàn)獲取接口變量信息,需要的可以參考一下2022-05-05Go語(yǔ)言中如何實(shí)現(xiàn)并發(fā)
Go的并發(fā)機(jī)制通過(guò)協(xié)程和通道的簡(jiǎn)單性和高效性,使得編寫并發(fā)代碼變得相對(duì)容易,這種并發(fā)模型被廣泛用于構(gòu)建高性能的網(wǎng)絡(luò)服務(wù)、并行處理任務(wù)和其他需要有效利用多核處理器的應(yīng)用程序,這篇文章主要介紹了在Go中如何實(shí)現(xiàn)并發(fā),需要的朋友可以參考下2023-09-09解決golang sync.Wait()不執(zhí)行的問(wèn)題
這篇文章主要介紹了解決golang sync.Wait()不執(zhí)行的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-12-12如何使用騰訊云go sdk 查詢對(duì)象存儲(chǔ)中最新文件
這篇文章主要介紹了使用騰訊云go sdk 查詢對(duì)象存儲(chǔ)中最新文件,這包括如何創(chuàng)建COS客戶端,如何逐頁(yè)檢索對(duì)象列表,并如何對(duì)結(jié)果排序以找到最后更新的對(duì)象,我們還展示了如何優(yōu)化用戶體驗(yàn),通過(guò)實(shí)時(shí)進(jìn)度更新和檢索多個(gè)文件來(lái)改進(jìn)程序,需要的朋友可以參考下2024-03-03GO語(yǔ)言的數(shù)組array與切片slice詳解
這篇文章主要介紹了GO語(yǔ)言的數(shù)組array與切片slice,包括了GO語(yǔ)言數(shù)組定義賦值,GO語(yǔ)言多維數(shù)組,GO語(yǔ)言切片等知識(shí)點(diǎn)需要的朋友可以參考下2022-12-12go同步原語(yǔ)Phaser和Barrier區(qū)別
這篇文章主要為大家介紹了通過(guò)java講解go同步原語(yǔ)Phaser和Barrier區(qū)別,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12