亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用子包構建 go 接口

使用子包構建 go 接口

Go
皈依舞 2022-12-05 16:48:56
我正在開發我的第一個真正的 go 應用程序,并試圖將我的手放在應該結構化的代碼文件上。我的代碼的主要部分將是一些類型,它們都實現了一個公共接口。type Runner interface {   Run() string}他們將被打包。由于接口實現的數量將非常大,我想將它們(語義上)拆分為幾個子包。runner/   blue/   red/該Runner實現需要訪問在我的應用程序中別處定義的幾個其他接口(例如,Cache和Secret)。這些目前在單獨的包中定義和實現。我的計劃是使用一個Config結構,它包含所有這些實用程序接口并將其傳遞給Runner實現。我不確定如何最好地處理這些子包以及在哪里放置Config和接口聲明。我的直覺方法是在包中同時定義Config結構和Runner接口,runner并且只從那里返回一個[]Runner集合,但這違反了這個建議。此外,所需的導入數量和遇到被禁止的循環引用的危險讓我覺得,我的解決方案違背了最佳實踐。有什么建議可以改進我的代碼結構嗎?添加一個common包含我所有接口定義和Config結構的包是否可???
查看完整描述

1 回答

?
四季花海

TA貢獻1811條經驗 獲得超5個贊


我最終創建了一個domain包含接口和定義的包Config。


所以domain/domain.go我有


package domain



type Config struct {

    Cache

}


type Runner interface {

  Run() string

}


type Cache interface {

  // ...

}

如上所述,跑步者在子包中構建。我不導出類型,而是在每個包中都有一個函數收集所有類型并將它們作為接口返回。


runner/blue/blue.go:


package blue


import "my/domain"


func All(config domain.Config) (list []domain.Runner) {

    list = append(list, fooRunner{Config: config})

    list = append(list, barRunner{Config: config})

    return

}

runner/runner.go:


package runner


import ( 

  "my/runner/blue"

  "my/runner/red"

  "my/runner/domain"

)


func All(config domain.Config) (list []domain.Runner) {

    list = append(list, blue.All(config)...)

    list = append(list, red.All(config)...)

    return

}


查看完整回答
反對 回復 2022-12-05
  • 1 回答
  • 0 關注
  • 136 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號