<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
泛型生命週期只在編譯期,旨在為程式設計師生成程式碼,減少重複程式碼的編寫
在比較兩個數的大小時,沒有泛型的時候,僅僅只是傳入型別不一樣,我們就要再寫一份一模一樣的函數,如果有了泛型就可以減少這類程式碼
// 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
我們先改造一下上面的範例,只需要在函數後用中括號宣告T可能出現的型別,中間用符號"|" 分隔
// 使用泛型 func GetMaxNum[T int | int8](a, b T) T { if a > b { return a } return b }
如果型別太多了怎麼辦呢?這時候我們就可以自定義泛型型別
// 像宣告介面一樣宣告 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 }
如何呼叫這個帶有泛型的函數呢?
var a int = 10 var b int = 20 // 方法1,正常呼叫,編譯器會自動推斷出傳入型別是int GetMaxNum(a, b) // 方法2,顯式告訴函數傳入的型別是int GetMaxNum[int](a, b)
在2.2小節中我們可以看到一個泛型的簡單自定義型別,本節將會詳細描述泛型自定義型別的語法
any: 表示go裡面所有的內建基本型別,等價於interface{}
comparable: 表示go裡面所有內建的可比較型別:int、uint、float、bool、struct、指標等一切可以比較的型別
跟宣告介面一樣,使用type x interface{} 關鍵字來宣告,不過裡面的成員不再是方法,而是型別,型別之間用符號 "|" 隔開
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 }
符號"~"都是與型別一起出現的,用來表示支援該型別的衍生型別
// int8的衍生型別 type int8A int8 type int8B = int8 // 不僅支援int8, 還支援int8的衍生型別int8A和int8B type MyInt interface { ~int8 }
建立一個帶有泛型的結構體User,提供兩個獲取age和name的方法
注意:只有在結構體上宣告了泛型,結構體方法中才可以使用泛型
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 }
我們可以通過宣告結構體物件時,宣告泛型的型別來使用帶有泛型的結構體
// 宣告要使用的泛型的型別 var u User[int8, string] // 賦值 u.age = 18 u.name = "weiwei" // 呼叫方法 age := u.GetAge() name := u.GetName() // 輸出結果 18 weiwei fmt.Println(age, name)
將泛型和switch配合使用時,無法通過編譯
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 }
到此這篇關於Golang泛型的使用方法詳解的文章就介紹到這了,更多相關Golang泛型內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45