日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

Go 包循環引用及對策,你學會了嗎?

來源: 責編: 時間:2024-03-18 09:37:21 238觀看
導讀引言從 Java 轉到 Go 的開發同學,大概都會踩到第一個“坑”:Go 的包循環引用。Go 的包循環引用是什么意思呢?有一定經驗的開發者都知道循環依賴,比如 A 依賴了 B, B 依賴了 C ,C 又依賴了 A。這就構成了一個循環依賴(有環圖)

引言

從 Java 轉到 Go 的開發同學,大概都會踩到第一個“坑”:Go 的包循環引用。IiM28資訊網——每日最新資訊28at.com

Go 的包循環引用是什么意思呢?有一定經驗的開發者都知道循環依賴,比如 A 依賴了 B, B 依賴了 C ,C 又依賴了 A。這就構成了一個循環依賴(有環圖)。IiM28資訊網——每日最新資訊28at.com

在 Java 里面,循環依賴是類級別的;但 Go 里要更嚴格一些:Go 的循環引用判定是 包級別的。舉個例子,包 A 下的類 A 依賴了包 B 下的類 B,類 B 又依賴了包 C 下的類 C, 類 C 又依賴了包 A 下的 D。在 Java 里面,這里并沒有構成循環依賴。但在 Go 里面,這導致了包循環引用:包 A => 包 B = > 包 C => 包 A。Go 會編譯不通過:報 import circle not allowed。IiM28資訊網——每日最新資訊28at.com

對包依賴不太重視的人,初期會感到不適應。本文舉幾個自己踩過的坑,作一說明。IiM28資訊網——每日最新資訊28at.com

包循環引用釋例

對象導致的包循環引用

哎呀呀,初來乍到,一下子給我來了八個包循環引用,打擊得我有點不知所措了。這是怎么回事呢 ?IiM28資訊網——每日最新資訊28at.com

圖片圖片IiM28資訊網——每日最新資訊28at.com

第一個循環引用,是因為上報的包 agent 下對象 DetectionBase 依賴了包 denoise 下的降噪模型結果對象 HitDenoiseModel,而在某一處,HitDenoiseModel  又引用了包 agent 下的另一個對象。IiM28資訊網——每日最新資訊28at.com

為什么會發生這個事情?這是因為,圖省事,我直接把輸出對象放到了輸入對象的包里,不想復制一份。正確的做法是,輸入的對象只能放輸入對象,不能放輸出對象,否則依賴就會擴大出去。IiM28資訊網——每日最新資訊28at.com

如何解決?有兩種方案:IiM28資訊網——每日最新資訊28at.com

  • 把 HitDenoiseModel 放在 agent 包下。然后定義另一個對象 denoise/DenoiseResultModel,將 FillHitDenoiseModel 方法移到包 denoise 下,HitDenoiseModel 賦值給 DenoiseResultModel。這樣形成了包 denoise => agent 的單向依賴,保證“輸出 =>輸入” 的單向依賴。不過,這種方法還是存在“篡改”原始數據的小罪行。
  • 不對 DetectionBase 做任何變更,新創建一個包和對象,把 HitDenoiseModel 放在新創建對象里,同時將 FillHitDenoiseModel 方法移到新創建對象的包下。3

啟示:避免篡改輸入對象。應用中的對象往往是很多的,不太重視包依賴,很容易造成對象的循環引用。即使你自己能夠小心確保不出問題,也會和別人添加的類造成循環引用。IiM28資訊網——每日最新資訊28at.com

發送消息與接收消息循環引用

梅開二度。又來了一個包循環引用。IiM28資訊網——每日最新資訊28at.com

圖片圖片IiM28資訊網——每日最新資訊28at.com

這又是怎么回事?有了第一次經驗,第二次就不那么慌了。先提個 MR ,看看引入了哪些類。尤其是循環引用的那條鏈路。我們看到 cdc/msg 這個地方作為起點開始循環。為什么會有循環呢?因為我本來打算把 msg 相關的消息對象和消息處理都放在一起。但這種方式很容易導致 循環引用。為什么呢?因為 引入消息對象的時候, 就會把包下的所有類引入的所有包都引進來,這樣就會把 /cdc/msg/XXXReceiver 引入,進而引入 /cdc/handler/XXXhandler, 而 msg/handler/XXXhandler 又會引入 msg/XXXSender。就導致了包循環引用依賴。IiM28資訊網——每日最新資訊28at.com

看來之前還是隨意慣了。IiM28資訊網——每日最新資訊28at.com

圖片圖片IiM28資訊網——每日最新資訊28at.com

怎么解決?把 XXXReceiver 放在包 receiver 下,把 XXXSender 放在包 sender 下即可。IiM28資訊網——每日最新資訊28at.com

啟示:IiM28資訊網——每日最新資訊28at.com

  • 引入類的包要小,這樣就很類似 Java 的全限定性包,減少循環引用的可能性。
  • 簡單的消息對象與復雜的消息處理不要放在一起,因為引入簡單的就會把復雜的引入,復雜的又會遞歸引入更多的依賴。

internal 引用了 share

一鍵三連。IiM28資訊網——每日最新資訊28at.com

下圖又是怎么回事?借鑒業界最佳實踐,咱們把一個工程下的代碼分為了 internal 和 share。其中 internal 的代碼不能被其它模塊訪問,只有 share 下的代碼作為橋梁,為其它模塊提供服務。IiM28資訊網——每日最新資訊28at.com

圖片圖片IiM28資訊網——每日最新資訊28at.com

這個是因為 internal/detect_config/AService 引用了 share/detect_config/BService ,然后 share/detect_config/CService 又引用了 internal/detect_config/DService。internal 包怎么能夠引用 share 下的包呢 ?內部模塊怎么能夠依賴外部模塊 ?世界似乎不那么美好了。IiM28資訊網——每日最新資訊28at.com

與同事討論,他們認為,helper 不應該依賴 service ,而應該依賴 repository, 而我一直認為 helper 是對 service 提供服務的一種高層封裝, helper 依賴 service 是很正常。helper 依賴 repository, 看上去說得也很有道理。不過 internal 模塊依賴 share 模塊,看上去總是感覺有點違反單向依賴的設計原則。IiM28資訊網——每日最新資訊28at.com

經過討論后,我和同事各做了修改。我的修改是讓 helper 依賴 repository, 同事的修改是,把原來 service 拆分成公共的 service 和內部的 service,保證 share 對 internal 的單向依賴。IiM28資訊網——每日最新資訊28at.com

運行時循環依賴

即使你幸運地逃過了包循環引用的檢測,但存在運行時循環依賴,Go 會直接卡住。IiM28資訊網——每日最新資訊28at.com

一個例子如下圖所示:有若干個流程組件 A, B, C,加載到一個工廠 F 下,由一個 執行器 E 依次從 F 中取出執行。但是呢,在流程組件C 中,又依賴了 E 來執行任務。這樣會導致循環依賴。在 Java 中,Spring 會忽略組件 C, 初始化成功,但運行時找不到 C 而導致流程出錯(可以用懶加載機制解決);但是 Go 就不那么幸運了(也許是幸運的,因為它讓你早點發現問題)。IiM28資訊網——每日最新資訊28at.com

對于這種場景,可以用消息隊列來解耦。IiM28資訊網——每日最新資訊28at.com

圖片圖片IiM28資訊網——每日最新資訊28at.com

對策匯總

遇到包循環引用,有哪些經驗可循呢 ?IiM28資訊網——每日最新資訊28at.com

(1) 提倡小而獨立的包。不要把大量的有關聯的類都放在一個包下。這樣,很容易因為一個類的引入,而引入更多依賴,導致依賴不可控。IiM28資訊網——每日最新資訊28at.com

(2)單向依賴原則。internal 下的類不應當依賴 share 下的類。因為 share 下的類一定會依賴 internal。如果 internal 又依賴 share ,就破壞了“單向依賴”原則。當工程越來越大時,一定會有一個點會爆發。不是不報,時候未到。細分包可以緩解這種問題,但不能從根本上避免單向依賴的破壞。IiM28資訊網——每日最新資訊28at.com

(3) 依賴倒置原則。盡量依賴接口,而不是具體實現類。IiM28資訊網——每日最新資訊28at.com

(4)使用消息隊列解耦依賴。IiM28資訊網——每日最新資訊28at.com

(5)相對合理的依賴方向:model => (constants, 無依賴的 model) ; dto => types => constants ;util => (dto, types, constants, models);service =>  repository => model ;helper => (repository, util, cache) ; controller => (helper, service) ;  receiver => handler => (service, helper)IiM28資訊網——每日最新資訊28at.com

最后問一句:Go 為什么不允許包循環引用呢 ?聽聽 Go 語言作者怎么說:IiM28資訊網——每日最新資訊28at.com

圖片圖片IiM28資訊網——每日最新資訊28at.com

再聽聽 AI 怎么說 :IiM28資訊網——每日最新資訊28at.com

圖片IiM28資訊網——每日最新資訊28at.com

小結

本文討論了幾個包循環引用的例子,并給出了相應的對策。IiM28資訊網——每日最新資訊28at.com

個人覺得,這種禁止循環引用的做法還是可取的,能培養良好的設計習慣。軟件開發,本質是應對結構復雜性的技藝。而設計思維,則是應對結構復雜性的重要法寶。開發人員應多多學習設計思考,保持系統和架構的優雅。IiM28資訊網——每日最新資訊28at.com

參考資料

  • go循環依賴最佳解決方案[1]

Reference

[1]go循環依賴最佳解決方案:https://juejin.cn/post/7290389972406501432IiM28資訊網——每日最新資訊28at.com

本文鏈接:http://m.www897cc.com/showinfo-26-76488-0.htmlGo 包循環引用及對策,你學會了嗎?

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: JQuery 4.0震撼發布:這是復興還是告別?

下一篇: 業務開發做到零 bug 有多難?

標簽:
  • 熱門焦點
  • 2023年Q2用戶偏好榜:12+256G版本成新主流

    3月份的性能榜、性價比榜和好評榜之后,就要輪到2023年的第二季度偏好榜了,上半年的新機潮已經過去,最明顯的肯定就是大內存和存儲的機型了,另外部分中端機也取消了屏幕塑料支架
  • 服務存儲設計模式:Cache-Aside模式

    Cache-Aside模式一種常用的緩存方式,通常是把數據從主存儲加載到KV緩存中,加速后續的訪問。在存在重復度的場景,Cache-Aside可以提升服務性能,降低底層存儲的壓力,缺點是緩存和底
  • 如何正確使用:Has和:Nth-Last-Child

    我們可以用CSS檢查,以了解一組元素的數量是否小于或等于一個數字。例如,一個擁有三個或更多子項的grid。你可能會想,為什么需要這樣做呢?在某些情況下,一個組件或一個布局可能會
  • 三言兩語說透柯里化和反柯里化

    JavaScript中的柯里化(Currying)和反柯里化(Uncurrying)是兩種很有用的技術,可以幫助我們寫出更加優雅、泛用的函數。本文將首先介紹柯里化和反柯里化的概念、實現原理和應用
  • 破圈是B站頭上的緊箍咒

    來源 | 光子星球撰文 | 吳坤諺編輯 | 吳先之每年的暑期檔都少不了瞄準追劇女孩們的古偶劇集,2021年有優酷的《山河令》,2022年有愛奇藝的《蒼蘭訣》,今年卻輪到小破站抓住了追
  • 最“俊美”淘寶賣家,靠直播和短視頻圈粉,上架秒光,年銷3000萬

    來源 | 電商在線文|易琬玉編輯|斯問受訪店鋪:Ringdoll戒之人形圖源:微博@御座的黃山、“Ringdoll戒之人形”淘寶店鋪有關外貌的評價,黃山已經聽累了。生于1985年的他,哪
  • 微博大門常打開,迎接海外畫師漂洋東渡

    作者:互聯網那些事“起猛了,我能看得懂日語了”。“為什么日本人說話我能聽懂?”“中文不像中文,日語不像日語,但是我竟然看懂了”…&hell
  • 支持aptX Lossless無損傳輸 iQOO TWS 1賽道版發布限時優惠價369元

    2023年7月4日,“無損音質,聲動人心”iQOO TWS 1正式發布,支持aptX Lossless無損傳輸,限時優惠價369元。iQOO TWS 1耳機率先支持端到端aptX Lossless無
  • OPPO Reno10 Pro英雄聯盟定制禮盒公布:薩勒芬妮同款配色夢幻十足

    5月24日,OPPO推出了全新的OPPO Reno 10系列,包含OPPO Reno10、OPPO Reno10 Pro和OPPO Reno10 Pro+三款新機,全系標配了超光影長焦鏡頭,是迄今為止拍照
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
亚洲深爱激情| 国产欧美一区二区精品仙草咪| 欧美伊人久久久久久久久影院| 亚洲欧美一区二区原创| 欧美资源在线观看| 蜜臀va亚洲va欧美va天堂| 欧美精品一线| 国产精品视频大全| 在线精品国产欧美| 99re66热这里只有精品4| 亚洲欧美在线观看| 久久久久久久高潮| 欧美日韩亚洲免费| 国产欧美一区二区色老头| 1024国产精品| 一区二区三区欧美日韩| 久久国产欧美| 欧美极品一区二区三区| 国产精品资源在线观看| 亚洲成人资源网| 亚洲一区免费| 蜜臀a∨国产成人精品| 国产精品剧情在线亚洲| 亚洲第一天堂av| 亚洲综合日韩| 欧美成人免费小视频| 国产精品男女猛烈高潮激情| 伊人久久大香线蕉综合热线| 亚洲视频在线一区观看| 久久一日本道色综合久久| 欧美视频一区二| 樱桃成人精品视频在线播放| 中国成人黄色视屏| 乱码第一页成人| 国产精品一区二区久久久| 亚洲人成高清| 久久精品一区二区三区四区| 欧美日韩综合一区| 亚洲国产高清在线观看视频| 午夜精品一区二区在线观看 | 99国产欧美久久久精品| 久久精品一级爱片| 国产精品videosex极品| 亚洲国产另类久久精品| 欧美在线观看www| 国产精品久久国产三级国电话系列| 亚洲国产成人精品女人久久久| 欧美一区二区三区成人| 欧美视频在线免费| 亚洲精品乱码久久久久久黑人 | 欧美男人的天堂| 在线不卡中文字幕| 欧美一区二区三区视频| 欧美亚洲成人网| 亚洲美女在线看| 欧美成人高清| 亚洲承认在线| 久久视频一区| 国语自产精品视频在线看抢先版结局 | 欧美视频一区二区在线观看 | 亚洲影院污污.| 欧美日韩18| 91久久精品国产91性色tv| 久久久美女艺术照精彩视频福利播放 | 久久精品国产77777蜜臀| 国产精品美女久久久久久免费| 亚洲乱码一区二区| 欧美成人免费在线视频| 亚洲福利国产精品| 另类专区欧美制服同性| 红桃视频一区| 欧美激情网站在线观看| 久久激情综合| 这里只有视频精品| 欧美激情第8页| 91久久夜色精品国产九色| 欧美国产欧美综合| 亚洲精品一区二区三区在线观看 | 欧美日韩在线观看一区二区| 久久综合九色九九| 99精品视频网| 国产日韩欧美一区在线 | 欧美性色综合| 欧美成人精品一区| 欧美日韩一区二区免费视频| 国产欧美欧美| 久久久一本精品99久久精品66| 欧美福利电影网| 国产一区二区三区在线观看视频| 午夜亚洲性色福利视频| 国产精品视频不卡| 性18欧美另类| 国产精品视频一区二区三区| 国产精品一区亚洲| 欧美视频免费在线观看| 国产精品乱人伦一区二区| 欧美大片在线观看一区| 午夜亚洲视频| av72成人在线| 亚洲精品四区| 午夜精品久久久久久99热| 免费精品视频| 国产日韩欧美一区| 亚洲精品小视频| 久久婷婷综合激情| 国产日韩亚洲欧美综合| 亚洲欧美视频| 亚洲国内自拍| 国产亚洲一区二区三区在线播放| 性一交一乱一区二区洋洋av| 国产亚洲二区| 久久综合五月天婷婷伊人| 亚洲日本欧美日韩高观看| 欧美日韩亚洲一区二区三区四区| 中文在线不卡视频| 国产欧美一区二区精品忘忧草 | 亚洲免费视频网站| 国内精品一区二区| 欧美成人首页| 亚洲一区二区视频| 好看的日韩av电影| 欧美精品v日韩精品v韩国精品v| 亚洲午夜一级| 韩国av一区二区| 欧美精品xxxxbbbb| 西瓜成人精品人成网站| 亚洲成色www8888| 国产精品成人午夜| 久久全国免费视频| 一本色道久久99精品综合 | 国产视频观看一区| 欧美顶级艳妇交换群宴| 亚洲一区二区三区免费在线观看| 国产一区二区精品在线观看| 你懂的亚洲视频| 亚洲欧美日韩一区二区在线 | 国产精品免费网站在线观看| 久久欧美中文字幕| 亚洲一区二区三区欧美| 一区在线观看视频| 欧美手机在线| 麻豆精品视频在线观看| 亚洲综合色噜噜狠狠| 欧美午夜在线观看| 久久尤物视频| 亚洲欧美日韩国产综合在线| 亚洲国产91| 国产精品稀缺呦系列在线| 麻豆精品在线视频| 亚洲欧美日韩另类精品一区二区三区| 亚洲国产毛片完整版 | 亚洲男人天堂2024| 亚洲黄色有码视频| 国产亚洲一级高清| 国产精品久久久久久福利一牛影视| 久久网站热最新地址| 亚洲与欧洲av电影| 亚洲人成高清| 国语自产精品视频在线看一大j8| 欧美日韩高清不卡| 久久婷婷丁香| 亚洲一本视频| 最新日韩av| 狠狠色综合色综合网络| 国产精品乱码| 欧美久久一级| 蜜臀av国产精品久久久久| 欧美一级夜夜爽| 亚洲一区二区成人| 亚洲乱码国产乱码精品精可以看| 狠狠操狠狠色综合网| 国产精品视频免费| 欧美日韩亚洲一区三区| 蘑菇福利视频一区播放| 久久精品二区三区| 亚洲欧美视频在线| 中文亚洲欧美| 亚洲精品久久久久| 亚洲国产乱码最新视频| 在线欧美一区| 激情丁香综合| 国产亚洲免费的视频看| 国产精品一区二区欧美| 欧美视频亚洲视频| 欧美视频精品一区| 欧美日韩免费观看一区| 欧美精品在线免费观看| 欧美高清在线播放| 欧美大片国产精品| 欧美福利视频在线| 欧美福利电影网| 欧美精品一区二| 欧美精品18videos性欧美| 欧美成ee人免费视频| 免费成人高清视频| 牛牛影视久久网| 欧美成人精品影院| 欧美夫妇交换俱乐部在线观看| 蜜桃av久久久亚洲精品| 免费高清在线一区| 欧美+日本+国产+在线a∨观看| 玖玖在线精品| 欧美成年人视频网站| 欧美激情精品久久久|