<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
假設我們要實現一個blog系統,在該系統中有以下兩個結構體:
type Category struct { ID int32 Name string Slug string } type Post struct { ID int32 Categories []Category Title string Text string Slug string }
為了提高系統的效能,我們需要實現一個快取系統,該快取可以用於快取各種型別,在該範例中我們限定為只能快取Category和Post型別。
根據Go泛型使用的三步曲提到的:型別引數化、定義型別約束、型別範例化我們一步步來定義我們的快取結構體。
第一步:定義型別約束
這裡我們先定義型別約束。因為在泛型中對型別引數進行約束是必要條件。所以要先定義型別約束。
因為要對分類Category型別和文章Post型別進行快取,所以我們這裡的快取型別約束限制在了這兩個型別上。約束介面定義如下:
type cacheable interface { Category | Post }
第二步:對型別進行引數化
現在我們建立一個名為cache的泛型結構體,並使用cacheable對其進行約束。
type cache[T cacheable] struct { data map[string]T }
我們看到cache的底層實際上是用map來進行儲存資料的,map的key是具體的型別字串,而map的值是引數化的型別T,即要在具體使用時根據需要對該引數T進行範例化。
為了能夠在cache結構體中儲存和獲取資料,我們再定義兩個方法如下:
func (c *cache[T]) Set(key string, value T) { c.data[key] = value } func (c *cache[T]) Get(key string) (v T) { if v, ok := c.data[key]; ok { return v } return }
這裡需要大家注意的是在泛型結構體型別中,定義方法的時候,也需要將型別引數T帶上的。因為只有在呼叫時對型別引數範例化後結構體中的型別才是明確的。
第三步:型別範例化
為了範例化cache結構體,我們建立了一個New函數來專門構造cache的範例。
func New[T cacheable]() *cache[T]{ c := cache[T]{} c.data = make(map[string]T) return &c }
這裡大家需要注意的是因為我們使用了泛型結構體型別cache,所以函數New也必須是泛型函數,只有這樣才能將泛型型別T的具體值傳遞到泛型結構體型別中。
當然,這裡還有另外一種範例化的cache的方法就是直接使用,這樣就不需要使用泛型函數New了。如下:
c := &cache[Category]{ data: make(map[string]T) }
好了,下面我們給出具體的main函數使用範例:
package main import ( "fmt" ) func main() { // create a new category category := Category{ ID: 1, Name: "Go Generics", Slug: "go-generics", } // create cache for blog.Category struct cc := New[Category]() // add category to cache cc.Set(category.Slug, category) fmt.Printf("cp get:%+vn", cc.Get(category.Slug)) // create a new post post := Post{ ID: 1, Categories: []Category{ {ID: 1, Name: "Go Generics", Slug: "go-generics"}, }, Title: "Generics in Golang structs", Text: "Here go's the text", Slug: "generics-in-golang-structs", } // create cache for blog.Post struct cp := New[Post]() // add post to cache cp.Set(post.Slug, post) fmt.Printf("cp get:%+vn", cp.Get(post.Slug)) }
好了,以上就是今天跟大家分享的內容。
到此這篇關於Go泛型實戰教學之如何在結構體中使用泛型的文章就介紹到這了,更多相關go結構體泛型內容請搜尋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