2017-06-03 42 views
1

在Go項目中組織接口及其實現的約定是什麼?在Go項目中組織接口及其實現的約定是什麼?

我是新來的你去創造一個小項目,我現在有這個文件夾結構:

src/ 
    my-repo/ 
     solve/ 
      backtracksolve.go 
      permutatesolve.go 
      ... 
      solver.go 

... (some repositories and packages omitted for brevity) ... 

backtracksolvepermutatesolve都實現接口solver所以它有意義,讓他們在同一個包中接口以及來自Java/C#的這種接口的其他實現,這是一種常見的慣例,例如,java.util包含諸如Set,Map,List的接口,同時還具有諸如HashSet,HashMapArrayList

但是在Go中,因爲它們都執行func Solve(),並且在package solve中都有redeclared exception

是爲每個實現(下面)創建一個子目錄還是完全不同的東西?

src/ 
    my-repo/ 
     solve/ 
      backtrack/ 
       backtracksolve.go 
      permutation/ 
       permutatesolve.go 

      solver.go 
+1

也許你想創建兩種'BacktrackSolver'和'PermuteSolver',它們都有方法'Solve()'。這將有助於抵制名稱衝突。 – md2perpe

回答

1

你一般會定義實現您Solver接口不同類型,然後定義這些類型的Solve功能。

func (s *BackTrackSolver) Solve() { … } 
func (s *PermutateSolver) Solve() { … } 

因爲類型具有不同的名稱,所以沒有名稱衝突。 您可以在線試用the go playground

關於你的包約定問題:我認爲一種好的方法是從一個包中的所有代碼開始,只將實際想要公開的類型和函數導出給調用者。然後,當你的code cohesion丟失時,你應該開始將代碼拆分成多個包。

也可以看看在從go blog了「組織Go代碼」的文章,該款「什麼放到一個包」(短讀)。

相關問題