Go1.18都出泛型了速來圍觀
go泛型使用的官方說明:https://go.dev/doc/tutorial/generics
在使用之前先把go更新到1.18或者以上的版本:https://go.dev/doc/install
如果用過c++或者Java的話,那么對泛型這個概念應(yīng)該是不陌生的。(下面這段定義摘抄自百度百科)
泛型程序設(shè)計(jì)(generic programming)是程序設(shè)計(jì)語言的一種風(fēng)格或范式。泛型允許程序員在強(qiáng)類型程序設(shè)計(jì)語言中編寫代碼時使用一些以后才指定的類型,在實(shí)例化時作為參數(shù)指明這些類型。
我們可以用個簡單的例子來看看如何使用泛型。
在沒有泛型之前,如果我們要寫一個比較大小的函數(shù)的話,因?yàn)間o里面沒有函數(shù)重載的概念,所以我們必須對需要比較的類型都創(chuàng)建一個比較函數(shù),不過這樣的話,就會有大量邏輯重復(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ù)留了一個泛型,名為comparable
,這是官方定義的一個可比較的類型約束
// 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 }
我們可以來自己聲明一個類型約束。
type Number interface { int | int32 | int64 | float32 }
如上定義表示如果參數(shù)類型要為int
、int32
、int64
、float32
這四個類型其中一個的適合,可以用Number替代。
所以我們可以把最初比較大小的代碼進(jì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ù)名后面用在中括號中使用類型約束,這時候在函數(shù)里面K
就表示Number這個類型約束,然后可以用在函數(shù)的參數(shù)列表、函數(shù)體、返回值中。
加入需要用到以int
或者float32
等基本類型為基礎(chǔ)的類型時,例如type MyInt int
,需要在類型名前面加上~
type Number interface { ~int }
如果不加的話,使用時會出現(xiàn)如下錯誤提示
# generics-demo
.\main.go:23:23: MyInt does not implement Number (possibly missing ~ for int in constraint Number)
到此這篇關(guān)于Go1.18都出泛型了,不來試試看?的文章就介紹到這了,更多相關(guān)Go1.18泛型內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Go利用反射reflect實(shí)現(xiàn)獲取接口變量信息
反射是通過實(shí)體對象獲取反射對象(Value、Type),然后可以操作相應(yīng)的方法。本文將利用Go語言中的反射reflect實(shí)現(xiàn)獲取接口變量信息,需要的可以參考一下2022-05-05解決golang sync.Wait()不執(zhí)行的問題
這篇文章主要介紹了解決golang sync.Wait()不執(zhí)行的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-12-12