精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Go1.18 泛型的好、壞亦或丑?

開發 后端
Go 泛型定了,有哪些好的使用場景,哪些不好的應用場景,亦或哪些使用看起來丑?本文聊聊這個問題。

[[442529]]

大家好,我是程序員幽鬼。

Go 泛型定了,有哪些好的使用場景,哪些不好的應用場景,亦或哪些使用看起來丑?本文聊聊這個問題。

1 簡介

泛型很棒,而且 Go 變得比以前更方便了。但是與可能非常有用的 channel 類似,我們不應該僅僅因為它們存在就到處使用它們。

除了用于數據結構,泛型還有其他很好的應用場景。當然,也有一些不好的用例,比如泛型日志器。還有一些可以使用的解決方案,但相當丑陋,還有一些東西真的很丑。

讓我們分別看一個例子!

2 好的應用場景

我真正夢想在 Go 中做的以及我認為我現在終于可以做的是 CRUD 端點的泛型提供程序:

  1. type Model interface { 
  2.     ID() string 
  3.  
  4. type DataProvider[MODEL Model] interface { 
  5.     FindByID(id string) (MODEL, error) 
  6.     List() ([]MODEL, error) 
  7.     Update(id string, model MODEL) error 
  8.     Insert(model MODEL) error 
  9.     Delete(id string) error 

這是一個大接口,你可以根據具體用例的需要縮短它,但是,為了完整性起見,我們暫時就這么寫。

現在你可以定義一個使用 DataProvider 的 HTTP 處理程序:

  1. type HTTPHandler[MODEL Model] struct { 
  2.     dataProvider DataProvider[MODEL] 
  3.  
  4. func (h HTTPHandler[MODEL]) FindByID(rw http.ResponseWriter, req *http.Request) { 
  5.     // validate request here 
  6.     id = // extract id here 
  7.     model, err := h.dataProvider.FindByID(id) 
  8.     if err != nil { 
  9.         // error handling here 
  10.         return 
  11.     } 
  12.     err = json.NewEncoder(rw).Encode(model) 
  13.     if err != nil { 
  14.         // error handling here 
  15.         return 
  16.     } 

如你所見,我們可以為每個方法實現一次,然后我們就完成了。我們甚至可以在事物的另一端創建一個客戶端,我們只需要為基本方法實現一次。

為什么我們在這里使用泛型而不是簡單的我們已經定義的 Model 接口?

與在此處使用 Model 類型本身相比,泛型有一些優點:

  • 使用泛型方法,DataProvider 根本不需要知道 Model,也不需要實現它。它可以簡單地提供非常強大的具體類型(但仍然可以為簡單的用例抽象)
  • 我們可以擴展這個解決方案并使用具體類型進行操作。讓我們看看插入或更新的驗證器會是什么樣子。
  1. type HTTPHandler[MODEL any] struct { 
  2.     dataProvider DataProvider[MODEL] 
  3.     InsertValidator func(new MODEL) error 
  4.     UpdateValidator func(old MODEL, new MODEL) error 

在這個驗證器中是泛型方法的真正優勢所在。我們將解析 HTTP 請求,如果定義了自定義的 InsertValidator,那么我們可以使用它來驗證模型是否檢出,我們可以以類型安全的方式進行并使用具體模型:

  1. type User struct { 
  2.     FirstName string 
  3.     LastName string 
  4.  
  5. func InsertValidator(u User) error { 
  6.     if u.FirstName == "" { ... }  
  7.     if u.LastName == "" { ... } 

所以我們有一個泛型的處理器,我們可以用自定義回調來調整它,它直接為我們獲取有效負載。沒有類型轉換。沒有 map。只有結構體本身!

3 不好的應用場景

一起看一個泛型日志器的例子:

  1. type GenericLogger[T any] interface { 
  2.     WithField(string, string) T 
  3.     Info(string) 

這本身還不是很有用。有更簡單的方法可以將鍵值字符串對添加到日志器,并且沒有日志器(據我所知)實際實現此接口。我們也不需要新的日志標準。如果我們想使用 logrus[1],我們必須這樣做:

  1. type GenericLogger[T any, FIELD map[string]interface{}] interface{ 
  2.     WithFields(M) T 
  3.     Info(string) 

如果我們添加自引用部分,這實際上可能由 logrus 日志器實現。但是,讓我們考慮在實際結構體中使用它,例如某種處理程序:

  1. type MessageHandler[T GenericLogger[T], FIELD map[string]interface{}] struct { 
  2.     logger GenericLogger[T, FIELD] 

為了在結構體中使用這個日志器,我們需要使我們的結構體泛型,這僅適用于日志器。如果 MessageHandler 本身正在處理泛型消息,那將變成第三個類型參數!

到目前為止,甚至沒有辦法將其分配給具有泛型的變量。所以,盡管我們可以用一個接口來表示這個日志器很棒,但我實際上建議不要這樣做。而我最喜歡的日志庫 (zap[2]),由于其字段的性質,甚至無法用它來表示。

4 丑的場景

當我使用泛型時,我發現缺少對在方法中引入新泛型參數的支持。雖然這可能有很好的理由,但它確實需要一些解決方法。讓我們想象一下我們想要將一個 map 簡化為一個整數。理想情況下,我們將通過使用返回新泛型參數的方法來完成此操作,然后我們可以簡單地提供 map reduce 函數。

那么,當我們仍然想以泛型方式縮小該 map 時,我們該怎么辦?既然沒有方法,那么讓我們創建一個方法:

  1. type GenericMap[KEY comparable, VALUE any] map[KEY]VALUEfunc (g GenericMap[KEY, VALUE]) Values() []VALUE { 
  2.     values := make([]VALUE, len(g)) 
  3.     for _, v := range g { 
  4.         values = append(values, v) 
  5.     } 
  6.     return values 
  7.  
  8. func Reduce[KEY comparable, VALUE anyRETURN any](g GenericMap[KEY, VALUE], callback func(RETURNKEY, VALUE "KEY comparable, VALUE any, RETURN any"RETURNRETURN { 
  9.     var r RETURN 
  10.     for k, v := range g { 
  11.         r = callback(r, k, v) 
  12.     } 
  13.     return r 

GenericMap 成為第一個參數或我們的 Reduce 函數。在這種情況下,你可以使用任何類型的 map 作為第一個參數,而不是 GenericMap。然而,我想說明的一點是,如果這個方法本身是 GenericMap 的一部分,那就太好了。即使不是,我們仍然可以模仿這種行為。總的來說,我可能仍會在某些用例中使用這種模式,即使它實際上很丑陋。

5 真的很丑

有時你可能想要使用工廠模式,它為你提供諸如 DataProviders 之類的東西。你可能希望在動態注冊的端點上獲取提供程序。所以你可以這樣做:

  1. type DataProviderFactory struct { 
  2.     dataProviders map[providerKey]any 
  3. func ProviderByName[MODEL Model](factory *DataProviderFactory, name string "MODEL Model") (DataProvider[MODEL], bool) { 
  4.         var m MODEL 
  5.     prov, has := factory.dataProviders[providerKey{namename, typ: reflect.TypeOf(m)}] 
  6.     if !has { 
  7.        return nil, false 
  8.     } 
  9.     return prov.(DataProvider[MODEL]), true  
  1. func RegisterProvider[MODEL Model](factory *DataProviderFactory, name string, p DataProvider[MODEL] "MODEL Model") { 
  2.     var m MODEL 
  3.     factory.dataProviders[providerKey{namename, typ: reflect.TypeOf(m)}] = p  

雖然這有效,雖然它可能有用,但它是很丑。它將丑陋(反射)與更丑陋(泛型)的東西結合在一起。

雖然從技術上講這應該是類型安全的,但由于我們的復合鍵具有名稱和反射類型,它仍然很難看。我是否要把它放在生產代碼的任何地方,我會很糾結。

6 總結

雖然我喜歡泛型,但我認為很難取得平衡,尤其是在開始的時候。所以我們需要確保記住它們為什么存在,在什么情況下我們應該使用它們,什么時候我們應該避免它們!

原文鏈接:https://itnext.io/golang-1-18-generics-the-good-the-bad-the-ugly-5e9fa2520e76

參考資料

[1]logrus: https://github.com/sirupsen/logrus

[2]zap: https://github.com/uber-go/zap

本文轉載自微信公眾號「幽鬼」,可以通過以下二維碼關注。轉載本文請聯系幽鬼公眾號。

 

責任編輯:武曉燕 來源: 幽鬼
相關推薦

2021-12-15 12:59:56

Go泛型版Beta1

2021-12-02 18:21:49

GoIP 包設計

2021-12-15 10:23:56

Go 1.18 Bet語言泛型

2022-01-26 09:02:57

GoCut方法

2021-11-01 12:41:39

Go

2021-10-18 10:53:26

Go 代碼技術

2022-02-11 21:01:18

GoNetip網絡庫

2022-07-12 06:17:43

GoogleGolang開發工作

2021-12-03 18:29:31

GoAny 泛型

2022-02-14 09:32:49

Go場景TryLock

2022-03-18 18:00:00

編程語言泛型支持模糊測試

2022-01-19 08:51:00

Module工作區Go

2021-10-29 10:55:07

Go 泛型語言

2022-01-10 11:33:17

Go測試軟件

2023-01-28 08:05:32

轉換Go泛型

2022-01-05 07:07:37

Go核心設計

2021-12-27 18:27:18

GoTryLockJava

2022-03-28 13:34:26

Go泛型部署泛型

2020-11-24 13:05:35

Go語言泛型

2022-10-24 08:55:13

Go工具鏈開發者
點贊
收藏

51CTO技術棧公眾號

风间由美一区二区三区在线观看| 六九午夜精品视频| aaa国产一区| 亚洲最新在线视频| 欧美三级午夜理伦三级富婆| 毛片在线看片| 美女看a上一区| 欧美成人免费全部观看天天性色| 亚洲av无码专区在线播放中文| 色网在线免费观看| 中文字幕第一页久久| 国产精品一二三视频| 午夜精品福利在线视频| 女人抽搐喷水高潮国产精品| 欧美日韩一区二区三区在线| 婷婷视频在线播放| 在线观看xxx| 精品一区二区三区的国产在线播放| 两个人的视频www国产精品| 亚洲av人人澡人人爽人人夜夜| 欧美第一视频| 亚洲精品免费一二三区| 国产福利一区二区三区在线观看| 国产精品第5页| 91精品综合| 日韩av最新在线观看| 欧美美女一级片| 国产夫妻在线| 1024精品合集| 精品不卡一区二区三区| 91亚洲国产成人精品一区| 99精品国产福利在线观看免费 | 爱情岛亚洲播放路线| 不卡的av中国片| 国产精品爽爽爽爽爽爽在线观看| 国产一级生活片| 欧美va久久久噜噜噜久久| 日韩欧美国产系列| 色综合天天色综合| 人妖欧美1区| 国产精品久久久久久久久免费丝袜 | 人体精品一二三区| 久久中文字幕无码| 99久久99久久精品国产片桃花| 日韩精品黄色网| av在线天堂网| 精品视频一二| 欧美日韩中文精品| 日本女优爱爱视频| 婷婷色在线资源| 中文字幕一区二区三| 亚洲欧美国产精品桃花| 免费在线一级视频| 国产精品69久久久久水密桃| 国产精品丝袜久久久久久高清| 五月婷婷色丁香| 亚洲国产清纯| 欧美一二三区精品| 在线观看国产福利| 91视频亚洲| 日韩视频免费观看高清完整版在线观看 | 国产一区二区毛片| 91欧美视频网站| 国产jzjzjz丝袜老师水多| 国产精品99久久久久久久女警| 99久久精品无码一区二区毛片| 国产手机视频在线| 成人精品国产免费网站| 精品无码久久久久国产| 免费在线一级视频| 中文字幕一区二区三区不卡| 狠狠精品干练久久久无码中文字幕 | 日本不卡一区二区在线观看| 久久av偷拍| 欧美精品一区二区三区高清aⅴ | 91精品久久久久久久久| 国产精选久久久| 国产suv精品一区二区6| 久久精彩视频| 午夜在线小视频| 一区二区国产视频| 欧美aⅴ在线观看| 国产人妖一区| 精品奇米国产一区二区三区| 国产精品边吃奶边做爽| 日韩成人三级| 欧美激情视频在线免费观看 欧美视频免费一 | 日韩av快播网址| 92久久精品一区二区| 高清不卡在线观看av| 欧美日韩亚洲在线| 成人影欧美片| 欧美视频在线观看免费| 奇米视频888| 久久久久97| 久久精品中文字幕电影| 国产欧美日韩另类| 极品美女销魂一区二区三区免费| 精品网站在线看| 国产激情视频在线| 91久久线看在观草草青青| 国产人妻精品久久久久野外| 九色精品91| 欧美日本在线视频中文字字幕| chinese国产精品| 国产一区91精品张津瑜| 日本精品一区| av电影在线免费| 欧美日本一区二区在线观看| 狠狠人妻久久久久久综合蜜桃| 国产精品精品国产一区二区| 欧美一级免费视频| 亚洲国产精品二区| 国产精品麻豆网站| 无遮挡又爽又刺激的视频| av不卡一区| xvideos成人免费中文版| 天天综合网久久综合网| 懂色av中文一区二区三区| 亚洲午夜精品福利| 成人性生交大片免费网站 | 成人美女av在线直播| 青青操在线视频| 天天综合网 天天综合色| 91免费视频污| 91综合久久| 国产精品爽黄69天堂a| 欧美偷拍视频| 黄色成人在线免费| 国产香蕉精品视频| 在线观看免费一区二区| 国产日韩欧美中文在线播放| 久草在线网址| 欧美日韩一区二区免费在线观看 | 欧美丝袜足交| 国内成人精品视频| www.成人在线观看| 一区二区三区在线免费播放| 色网站在线视频| 国产精品国产一区| 成人黄色av网| 黄色av电影在线播放| 欧美精品亚洲一区二区在线播放| 公肉吊粗大爽色翁浪妇视频| 日韩影院免费视频| 亚洲高清不卡一区| 久久久久久久性潮| 日韩中文字幕视频| 一级做a爰片久久毛片16| 国产精品视频免费看| 国产性生交xxxxx免费| 国产精品入口久久| 国产成人自拍视频在线观看| 国产最新视频在线观看| 色婷婷av一区二区三区之一色屋| 欧美日韩高清丝袜| 免费在线观看精品| 福利网在线观看| 99精品国产高清一区二区麻豆| 久久久午夜视频| 污污网站免费在线观看| 精品久久久久久亚洲国产300| 星空大象在线观看免费播放| 亚洲女同同性videoxma| 欧美一卡2卡3卡4卡无卡免费观看水多多| xxx欧美xxx| 中文字幕精品—区二区| 国产精品久久久久久久久久久久久久久久久久| 中文字幕一区二区三区四区 | 亚洲成人黄色| 午夜免费久久久久| 国产三级电影在线| 欧美日韩mp4| 精品肉丝脚一区二区三区| 91丨九色丨黑人外教| 91在线视频观看免费| 婷婷成人基地| 国产日韩亚洲精品| 精品日韩视频| 欧美日韩电影在线观看| 天堂av一区二区三区| 欧美亚洲一区三区| 中文字幕在线观看成人 | 你懂得在线观看| 国产成人免费xxxxxxxx| 国产黄色特级片| 亚洲电影在线一区二区三区| 国产一区精品在线| 巨胸喷奶水www久久久| 欧美激情国产精品| 国产专区在线| 日韩情涩欧美日韩视频| 国产成人精品网| 亚洲欧美日韩在线| 国产成人无码精品久久二区三| 韩国毛片一区二区三区| 亚洲自偷自拍熟女另类| 亚洲乱码精品| 欧美黑人3p| 亚洲无线观看| 91精品国产自产在线| 最近高清中文在线字幕在线观看1| 日韩中文字幕在线视频播放| 天天操天天射天天舔| 欧美日韩国产另类一区| av大片免费观看| 日韩毛片精品高清免费| 扒开jk护士狂揉免费| 国产精一品亚洲二区在线视频| 成年人免费大片| 精品99视频| 视色,视色影院,视色影库,视色网| 欧美综合在线视频观看| 久久av一区二区| 日韩视频一二区| 国产日产久久高清欧美一区| www.com.cn成人| 97色在线播放视频| 美女日批视频在线观看| 久久精品视频免费播放| 国产女人在线视频| 精品一区二区三区四区在线| 免费看国产片在线观看| 欧美99久久| 欧美一区二区在线免费播放| 日韩电影在线观看一区二区| 午夜视黄欧洲亚洲| 国产亚洲精品久久777777| 亚洲三级在线免费观看| 国产精品麻豆一区| 欧美激情综合网| 黄免费在线观看| 国产日韩欧美一区二区三区综合| 久久午夜夜伦鲁鲁片| 99久久国产综合色|国产精品| 亚洲av无一区二区三区久久| 韩国成人福利片在线播放| 91极品尤物在线播放国产| 日韩黄色免费网站| 爱情岛论坛vip永久入口| 玖玖在线精品| 色多多视频在线播放| 日本va欧美va瓶| 国产一二三区av| 久久se这里有精品| 国内自拍第二页| 国产一区二区三区黄视频 | 亚洲最快最全在线视频| 欧美日韩成人免费观看| 亚洲午夜精品网| 久久精品视频久久| 午夜精品久久久久久久99樱桃| 久久久久久久伊人| 天天免费综合色| 亚洲s码欧洲m码国产av| 在线观看国产精品网站| 一区二区www| 欧美一级夜夜爽| 日本久久一级片| 亚洲欧美日韩网| 亚洲欧美视频一区二区| 久久精品99久久香蕉国产色戒| av毛片在线免费看| 国模精品一区二区三区色天香| 国产盗摄——sm在线视频| 日韩美女免费视频| 色狠狠一区二区三区| 亚洲综合av影视| 久久综合社区| 亚洲欧美一区二区精品久久久 | 久久精品日韩欧美| 成年人网站大全| 精品在线观看免费| 日本一区二区在线观看视频| 久久久青草青青国产亚洲免观| 一二三四在线观看视频| 亚洲欧美国产三级| 好看的av在线| 3d动漫精品啪啪| 亚洲色欧美另类| 日韩视频在线观看免费| 丰满大乳少妇在线观看网站| 国产成人中文字幕| 一区二区亚洲视频| 久久综合九九| 亚洲区综合中文字幕日日| 日本阿v视频在线观看| 久久久久久穴| 第一页在线视频| 中国色在线观看另类| 国产污片在线观看| 欧美日韩中字一区| 色哟哟中文字幕| www.xxxx欧美| 亚洲最大网站| 亚洲一区二区在线播放| 欧美日韩播放| 精品一区二区三区无码视频| 日韩成人免费电影| 最近日本中文字幕| 1024成人网| 午夜精品免费观看| 亚洲国产精品网站| а√天堂资源地址在线下载| 国产a∨精品一区二区三区不卡| 麻豆一区在线| 亚洲无玛一区| 久久婷婷影院| 精品少妇人妻av一区二区三区| 国产精品免费视频网站| 国产又大又黄又粗| 精品国产乱码久久久久久1区2区 | 亚洲激情图片qvod| 在线观看亚洲黄色| 日韩av网址在线| 一二三四区在线观看| 国产免费一区二区三区在线观看 | 久久久99久久| 久久久久久久久久影院| 日韩欧美国产麻豆| 日韩毛片久久久| 国产成人亚洲综合| 久久这里只有精品一区二区| av动漫在线播放| 极品美女销魂一区二区三区免费| 国产精品情侣呻吟对白视频| 欧美性生交大片免费| 婷婷色在线视频| 欧美交受高潮1| 亚洲网一区二区三区| 亚洲天堂第一区| 国产精品白丝jk黑袜喷水| 久久国产高清视频| 欧美乱妇20p| 黄色免费在线看| 成人网址在线观看| 亚洲精品国产成人影院| 午夜视频在线观| 亚洲欧美一区二区三区久本道91| 夜夜嗨aⅴ一区二区三区| 这里只有精品久久| 国产成人精品一区二区三区视频| 日韩欧美三级电影| 日韩1区2区日韩1区2区| 波多野结衣一二三四区| 欧美在线观看视频一区二区 | 一区二区三区不卡视频| 精品国产999久久久免费| 久久这里有精品| 亚洲日本视频在线| 日韩一级片免费视频| av一区二区三区黑人| 可以免费在线观看的av| 亚洲免费影视第一页| 国产亚洲一区二区手机在线观看 | 国产精品久久久免费| 亚洲一区二区三区四区五区六区| 欧美午夜片在线免费观看| 欧美91精品久久久久国产性生爱| 国产xxx69麻豆国语对白| 国内精品视频在线观看| 亚洲精品20p| 亚洲一区二区三区四区五区中文 | 免费观看亚洲天堂| 久久在线中文字幕| 91美女片黄在线观看| 中文字幕 国产精品| 久久在线视频在线| 精品欧美午夜寂寞影院| 久久久久免费精品| 综合婷婷亚洲小说| 狠狠躁夜夜躁av无码中文幕| 欧美有码在线视频| 久久激情电影| 久久黄色一级视频| 欧美日韩国产综合新一区 | 天天干天天操天天玩| 伊人色综合久久天天| 欧洲亚洲在线| 成人在线免费观看视视频| 伊人成人在线视频| 欧美激情亚洲色图| 精品人在线二区三区| 国产综合色区在线观看| 日本a级片在线播放| 国产亚洲一区二区在线观看| 国产精品自偷自拍| 人妖精品videosex性欧美| 影视亚洲一区二区三区| 日韩人妻一区二区三区| 欧美一区二区三区精品| 亚洲日本天堂| 97在线免费视频观看| 久久精品无码一区二区三区| 国产深喉视频一区二区| 秋霞av国产精品一区| 亚洲精品久久久| av电影在线不卡| 亚洲加勒比久久88色综合| 在线成人免费|