我正在開發我的第一個真正的 Go 應用程式,并試圖圍繞我的代碼檔案進行結構化。
我的代碼的主要部分將是許多型別,它們都實作了一個通用介面。
type Runner interface {
Run() string
}
他們將被裝在一個包裹里。由于介面實作的數量將非常大,我想將它們(語意上)分成幾個子包。
runner/
blue/
red/
該Runner實作需要訪問在我的應用程式中其他地方定義的幾個其他介面(例如Cache和Secret)。這些目前在單獨的包中定義和實作。我的計劃是使用一個Config結構,它包含所有這些實用程式介面并將其傳遞給Runner實作。
我不確定如何最好地處理這些子包以及在哪里放置Config和介面宣告。我的直觀方法是在包中同時定義Config結構和Runner介面,runner并只從那里回傳一個[]Runner集合,但這違反了這個建議。此外,所需的匯入數量和遇到被禁止的回圈參考的危險讓我感覺,我的解決方案違背了最佳實踐。
有什么建議可以改善我的代碼結構嗎?建議添加一個common包含我所有介面定義和Config結構的包嗎?
uj5u.com熱心網友回復:
我最終創建了一個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
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/465251.html
上一篇:在golang中使用路徑變數呼叫GETRESTAPI
下一篇:基于時間的比例計算
