【问题标题】:Structuring models in Go在 Go 中构建模型
【发布时间】:2013-09-05 20:36:37
【问题描述】:

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

谢谢!

【问题讨论】:

    标签: model go


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

      这种方法还可以更轻松地测试(可能是模拟的)模型。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-10-18
        • 2017-04-20
        • 1970-01-01
        • 1970-01-01
        • 2021-01-23
        • 2018-04-03
        相关资源
        最近更新 更多