在Go项目中组织接口及其实现的惯例是什么?
我是Go的新手并创建一个小项目,我目前有这个文件夹结构:
src/
my-repo/
solve/
backtracksolve.go
permutatesolve.go
...
solver.go
... (some repositories and packages omitted for brevity) ...
backtracksolve
和permutatesolve
都实现了接口solver
,因此将它们保存在与接口和该接口的其他实现相同的包中是有意义的,来自Java / C#this例如,java.util
包含Set
,Map
,List
等接口,同时还包含HashSet
,HashMap
等实现}和ArrayList
。
但是在Go中,因为它们都实现了func Solve()
,并且package solve
中都有redeclared exception
。
为每个实现创建一个子目录(下面)或完全不同的东西是不是常规?
src/
my-repo/
solve/
backtrack/
backtracksolve.go
permutation/
permutatesolve.go
solver.go
答案 0 :(得分:1)
您通常会定义实现Solver
接口的不同类型,然后在这些类型上定义Solve
函数。
func (s *BackTrackSolver) Solve() { … }
func (s *PermutateSolver) Solve() { … }
因为类型具有不同的名称,所以没有名称冲突。 您可以在the go playground在线试用。
关于你的包约定问题:我认为一个好的方法是从单个包中的所有代码开始,只导出你实际想要向调用者公开的类型和函数。然后,当您code cohesion丢弃时,您应该开始将代码拆分为多个包。
另请参阅"组织Go代码"文章来自go blog,小节"什么放入包装" (简短阅读)。