3

我试图找出在 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 的更大示例?我在这里找到了一个例子,但它仍然很小,作者指出他是 Go 的初学者,所以我不确定有多少值得信任。

谢谢!

4

2 回答 2

0

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

于 2013-09-05T20:56:03.370 回答
0

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

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

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

于 2013-09-06T07:41:59.840 回答