在Go中构建模型

时间:2013-09-05 20:36:38

标签: model go

我正在试图找出在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的初学者,所以我不确定要信任多少。

谢谢!

2 个答案:

答案 0 :(得分:0)

无需将每个模型放在单独的包中。事实上,他们可能只是进入主包。如果几个包彼此之间存在各种相互依赖关系,那么它们在概念上并不足以成为单独的包。

答案 1 :(得分:0)

不需要将所有模型合并到单个包中,只是为了打破循环导入问题。我建议改用接口。

某些(可能是叶子)包只定义了定义模型行为的接口。注意:接口不定义数据。但是任何数据都可以通过getter和setter方法抽象为行为。然后,您可以在任何您喜欢的地方拥有任意数量的实体来满足该界面 - 无论是否在单独的包中。

这种方法也使测试(可能是模拟的)模型更容易。