您好,登錄后才能下訂單哦!
這篇文章主要介紹了Golang泛型如何使用的相關(guān)知識,內(nèi)容詳細(xì)易懂,操作簡單快捷,具有一定借鑒價(jià)值,相信大家閱讀完這篇Golang泛型如何使用文章都會有所收獲,下面我們一起來看看吧。
泛型生命周期只在編譯期,旨在為程序員生成代碼,減少重復(fù)代碼的編寫
在比較兩個(gè)數(shù)的大小時(shí),沒有泛型的時(shí)候,僅僅只是傳入類型不一樣,我們就要再寫一份一模一樣的函數(shù),如果有了泛型就可以減少這類代碼
// int func GetMaxNumInt(a, b int) int { if a > b { return a } return b } // int8 func GetMaxNumInt8(a, b int8) int8 { if a > b { return a } return b }
需要go版本大于等于1.18
我們先改造一下上面的示例,只需要在函數(shù)后用中括號聲明T可能出現(xiàn)的類型,中間用符號"|" 分隔
// 使用泛型 func GetMaxNum[T int | int8](a, b T) T { if a > b { return a } return b }
如果類型太多了怎么辦呢?這時(shí)候我們就可以自定義泛型類型
// 像聲明接口一樣聲明 type MyInt interface { int | int8 | int16 | int32 | int64 } // T的類型為聲明的MyInt func GetMaxNum[T MyInt](a, b T) T { if a > b { return a } return b }
如何調(diào)用這個(gè)帶有泛型的函數(shù)呢?
var a int = 10 var b int = 20 // 方法1,正常調(diào)用,編譯器會自動推斷出傳入類型是int GetMaxNum(a, b) // 方法2,顯式告訴函數(shù)傳入的類型是int GetMaxNum[int](a, b)
在2.2小節(jié)中我們可以看到一個(gè)泛型的簡單自定義類型,本節(jié)將會詳細(xì)描述泛型自定義類型的語法
any: 表示go里面所有的內(nèi)置基本類型,等價(jià)于interface{}
comparable: 表示go里面所有內(nèi)置的可比較類型:int、uint、float、bool、struct、指針等一切可以比較的類型
跟聲明接口一樣,使用type x interface{} 關(guān)鍵字來聲明,不過里面的成員不再是方法,而是類型,類型之間用符號 "|" 隔開
type MyInt interface { int | int8 | int16 | int32 | int64 }
成員類型支持go中所有的基本類型
type MyT interface { int | float32 | bool | chan int | map[int]int | [10]int | []int | struct{} | *http.Client }
符號"~"都是與類型一起出現(xiàn)的,用來表示支持該類型的衍生類型
// int8的衍生類型 type int8A int8 type int8B = int8 // 不僅支持int8, 還支持int8的衍生類型int8A和int8B type MyInt interface { ~int8 }
創(chuàng)建一個(gè)帶有泛型的結(jié)構(gòu)體User,提供兩個(gè)獲取age和name的方法
注意:只有在結(jié)構(gòu)體上聲明了泛型,結(jié)構(gòu)體方法中才可以使用泛型
type AgeT interface { int8 | int16 } type NameE interface { string } type User[T AgeT, E NameE] struct { age T name E } // 獲取age func (u *User[T, E]) GetAge() T { return u.age } // 獲取name func (u *User[T, E]) GetName() E { return u.name }
我們可以通過聲明結(jié)構(gòu)體對象時(shí),聲明泛型的類型來使用帶有泛型的結(jié)構(gòu)體
// 聲明要使用的泛型的類型 var u User[int8, string] // 賦值 u.age = 18 u.name = "weiwei" // 調(diào)用方法 age := u.GetAge() name := u.GetName() // 輸出結(jié)果 18 weiwei fmt.Println(age, name)
將泛型和switch配合使用時(shí),無法通過編譯
func Get[T any]() T { var t T switch T { case int: t = 18 } return t }
只能先將泛型賦值給interface才可以和switch配合使用
func Get[T any]() T { var t T var ti interface{} = &t switch v := ti.(type) { case *int: *v = 18 } return t }
關(guān)于“Golang泛型如何使用”這篇文章的內(nèi)容就介紹到這里,感謝各位的閱讀!相信大家對“Golang泛型如何使用”知識都有一定的了解,大家如果還想學(xué)習(xí)更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。