版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第golang包循環(huán)引用的幾種解決方案總結(jié)目錄1.golang包循環(huán)引用的幾種解決方案1.1.前言1.2.新建公共接口包(父包),將需要循環(huán)調(diào)用的函數(shù)或方法抽象為接口1.3.新建公共組合包(子包),在組合包中組合調(diào)用1.4.全局存儲需要相互依賴的函數(shù),通過關(guān)鍵字進(jìn)行調(diào)用1.5.不需要回調(diào)結(jié)果的可以通過事件總線(eventBus)解耦總結(jié)
1.golang包循環(huán)引用的幾種解決方案
1.1.前言
golang為了加速編譯,不允許包循環(huán)引用。通常來說,只要你的包規(guī)劃得好,嚴(yán)格規(guī)范單向調(diào)用鏈(如控制層-業(yè)務(wù)層-數(shù)據(jù)層),一般不會出現(xiàn)包循環(huán)引用問題。當(dāng)然現(xiàn)實(shí)業(yè)務(wù)往往不會這么理想,同層級之間的不同包經(jīng)常需要互相引用,下面我就分享幾種解決包循環(huán)引用的方案。
1.2.新建公共接口包(父包),將需要循環(huán)調(diào)用的函數(shù)或方法抽象為接口
package_i
packagepackage_i
typePackageAInterfaceinterface{
PrintA()
typePackageBInterfaceinterface{
PrintB()
package_a
packagepackage_a
import(
"cycle/package_i"
"fmt"
typePackageAstruct{
Bpackage_i.PackageBInterface
func(aPackageA)PrintA(){
fmt.Println("I'ma!")
func(aPackageA)PrintAll(){
a.PrintA()
a.B.PrintB()
package_b
packagepackage_b
import(
"cycle/package_i"
"fmt"
typePackageBstruct{
Apackage_i.PackageAInterface
func(bPackageB)PrintB(){
fmt.Println("I'mb!")
func(bPackageB)PrintAll(){
b.PrintB()
b.A.PrintA()
main
packagemain
import(
"cycle/package_a"
"cycle/package_b"
funcmain(){
a:=new(package_a.PackageA)
b:=new(package_b.PackageB)
a.B=b
b.A=a
a.PrintAll()
b.PrintAll()
1.3.新建公共組合包(子包),在組合包中組合調(diào)用
package_c
packagepackage_c
import(
"cycle/package_a"
"cycle/package_b"
typeCombileABstruct{
A*package_a.PackageA
B*package_b.PackageB
func(cCombileAB)PrintAll(){
c.A.PrintA()
c.B.PrintB()
main
packagemain
import(
"cycle/package_a"
"cycle/package_b"
"cycle/package_c"
funcmain(){
a:=new(package_a.PackageA)
b:=new(package_b.PackageB)
c:=new(package_c.CombileAB)
c.A=a
c.B=b
c.PrintAll()
1.4.全局存儲需要相互依賴的函數(shù),通過關(guān)鍵字進(jìn)行調(diào)用
callback_mgr
packagecallback_mgr
import(
"fmt"
"reflect"
varcallBackMapmap[string]interface{}
funcinit(){
callBackMap=make(map[string]interface{})
funcRegisterCallBack(keystring,callBackinterface{}){
callBackMap[key]=callBack
funcCallBackFunc(keystring,args...interface{})[]interface{}{
ifcallBack,ok:=callBackMap[key];ok{
in:=make([]reflect.Value,len(args))
fori,arg:=rangeargs{
in[i]=reflect.ValueOf(arg)
outList:=reflect.ValueOf(callBack).Call(in)
result:=make([]interface{},len(outList))
fori,out:=rangeoutList{
result[i]=out.Interface()
returnresult
}else{
panic(fmt.Errorf("callBack(%s)notfound",key))
package_a
packagepackage_a
import(
"cycle/callback_mgr"
"fmt"
funcinit(){
callback_mgr.RegisterCallBack("getA",new(PackageA).GetA)
typePackageAstruct{
func(aPackageA)GetA()string{
return"I'ma!"
func(aPackageA)PrintAll(){
fmt.Println(a.GetA())
fmt.Println(callback_mgr.CallBackFunc("getB")[0].(string))
package_b
packagepackage_b
import(
"cycle/callback_mgr"
"fmt"
funcinit(){
callback_mgr.RegisterCallBack("getB",new(PackageB).GetB)
typePackageBstruct{
func(bPackageB)GetB()string{
return"I'mb!"
func(bPackageB)PrintAll(){
fmt.Println(b.GetB())
fmt.Println(callback_mgr.CallBackFunc("getA")[0].(string))
main
packagemain
import(
"cycle/package_a"
"cycle/package_b"
funcmain(){
a:=new(package_a.PackageA)
b:=new(package_b.PackageB)
a.PrintAll()
b.PrintAll()
1.5.不需要回調(diào)結(jié)果的可以通過事件總線(eventBus)解耦
eventBus
packageeventBus
import(
"/asaskevich/EventBus"
varglobalEventBusEventBus.Bus
funcinit(){
globalEventBus=EventBus.New()
funcSubscribe(topicstring,fninterface{})error{
returnglobalEventBus.Subscribe(topic,fn)
funcSubscribeAsync(topicstring,fninterface{},transactionalbool)error{
returnglobalEventBus.SubscribeAsync(topic,fn,transactional)
funcPublish(topicstring,args...interface{}){
globalEventBus.Publish(topic,args...)
package_a
packagepackage_a
import(
"cycle/eventBus"
"fmt"
funcinit(){
eventBus.Subscribe("PrintA",new(PackageA).PrintA)
typePackageAstruct{
func(aPackageA)PrintA(){
fmt.Println("I'ma!")
func(aPackageA)PrintAll(){
a.PrintA()
eventBus.Publish("PrintB")
package_b
packagepackage_b
import(
"cycle/eventBus"
"fmt"
func
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 魯濱遜題目及答案100道選擇題
- 藥劑科學(xué)習(xí)培訓(xùn)制度
- 阜寧縣中考題目及答案
- 臨考沖刺作文題目及答案
- 養(yǎng)老院老人心理輔導(dǎo)支持制度
- 高三電磁感應(yīng)題目及答案
- 養(yǎng)老院老人康復(fù)設(shè)施維修人員表彰制度
- 養(yǎng)老院老人健康監(jiān)測人員職業(yè)發(fā)展規(guī)劃制度
- 美團(tuán)酒店考試題目及答案
- 辦公室員工培訓(xùn)記錄與檔案制度
- 杭州中考初中英語詞匯表
- 2024年國企行測題庫
- 煙囪技術(shù)在血管腔內(nèi)修復(fù)術(shù)中的應(yīng)用
- 崗位聘用登記表
- 2023年全國統(tǒng)一高考政治試卷(新課標(biāo)ⅰ)(含解析版)
- 2023年北京高考語文答題卡(北京卷)word版可編輯kh
- 2023年高鐵信號車間副主任述職報(bào)告
- GB/T 5762-2012建材用石灰石、生石灰和熟石灰化學(xué)分析方法
- 第3章 圓錐曲線的方程【精簡思維導(dǎo)圖梳理】高考數(shù)學(xué)高效備考 人教A版2019選擇性必修第一冊
- 劉一秒演說智慧經(jīng)典(內(nèi)部筆記)
- 管道TOFD檢測記錄及續(xù)表
評論
0/150
提交評論