




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第golang包循環引用的幾種解決方案總結目錄1.golang包循環引用的幾種解決方案1.1.前言1.2.新建公共接口包(父包),將需要循環調用的函數或方法抽象為接口1.3.新建公共組合包(子包),在組合包中組合調用1.4.全局存儲需要相互依賴的函數,通過關鍵字進行調用1.5.不需要回調結果的可以通過事件總線(eventBus)解耦總結
1.golang包循環引用的幾種解決方案
1.1.前言
golang為了加速編譯,不允許包循環引用。通常來說,只要你的包規劃得好,嚴格規范單向調用鏈(如控制層-業務層-數據層),一般不會出現包循環引用問題。當然現實業務往往不會這么理想,同層級之間的不同包經常需要互相引用,下面我就分享幾種解決包循環引用的方案。
1.2.新建公共接口包(父包),將需要循環調用的函數或方法抽象為接口
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.新建公共組合包(子包),在組合包中組合調用
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.全局存儲需要相互依賴的函數,通過關鍵字進行調用
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.不需要回調結果的可以通過事件總線(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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 標準化政策研究-洞察闡釋
- 嗎啡類藥物的濫用與預防研究-洞察闡釋
- 懸掛式離子風機項目投資風險評估報告
- 混沌與智能城市-洞察闡釋
- 菱帥自動駕駛安全風險識別-洞察闡釋
- 基于神經網絡的帶狀地圖特征提取-洞察闡釋
- 用戶體驗設計咨詢-洞察闡釋
- 安全漏洞檢測與防護機制研究-洞察闡釋
- 跨國并購反壟斷審查-洞察闡釋
- 黃金與美元在新興市場國家中的投資機會-洞察闡釋
- 無人機的基本結構課件
- 領導科學正式完整版課件
- 國家開放大學電大《中國教育簡史》形考作業參考答案
- 白血病專題培訓講座培訓課件
- 高中政治《 科學立法》教學設計
- (完整word)a3標準規范試卷模板
- html5 web前端期末考試復習題
- 施工現場平面布置要求(完整已排版)
- 2022年碳酸鉀生產項目可行性研究報告
- 軟膠囊干燥除濕轉籠用戶需求URS
- 漢語拼音音節表帶聲調
評論
0/150
提交評論