我正在试图找出在Go中构建模型的惯用方法,但是我无法找到更大型企业类型应用程序的任何样本(只有很多猫和狗说话......)。
我开始将每个模型放入一个单独的包中,因为它似乎产生了最干净的API来使用模型:
import "models/person"
person.New(...) // returns the newly created person
person.GetById(123) // returns a single person
person.GetAll() // returns a list of people
然而,我遇到了我的模型需要相互引用的问题。我最终得到了如下所示的包:
-- File person.go
package Person
import "models/team"
type Person struct {
Name string
Team Team
}
func (p *Person) New(...) *Person {
...
}
-- File team.go
package Team
import "models/person"
type Team struct {
Name string
People []*Person
}
func (t *Team) New(...) *Team {
...
}
这不起作用,因为现在我有一个循环引用。我应该将所有这些模型添加到同一个包中,以便API看起来像这样吗?
import "model"
model.NewPerson(...) // returns the newly created person
model.GetPersonById(123) // returns a single person
model.GetAllPeople() // returns a list of people
或者我应该使用接口来解决这个问题(如果是这样,它们会是什么样子)?
我对如何处理数据库连接等问题也有疑问。人们通常如何直接或通过某些中间对象提供数据库连接?每个调用都需要将某个数据库的接口作为参数,还是有更好的方法呢?
是否有更大的示例在Go中构建完整的Rest API?我找到了一个例子here,但它仍然很小,作者注意到他是Go的初学者,所以我不确定要信任多少。
谢谢!
答案 0 :(得分:0)
无需将每个模型放在单独的包中。事实上,他们可能只是进入主包。如果几个包彼此之间存在各种相互依赖关系,那么它们在概念上并不足以成为单独的包。
答案 1 :(得分:0)
不需要将所有模型合并到单个包中,只是为了打破循环导入问题。我建议改用接口。
某些(可能是叶子)包只定义了定义模型行为的接口。注意:接口不定义数据。但是任何数据都可以通过getter和setter方法抽象为行为。然后,您可以在任何您喜欢的地方拥有任意数量的实体来满足该界面 - 无论是否在单独的包中。
这种方法也使测试(可能是模拟的)模型更容易。