使用结构转换Controller的子模型

时间:2014-08-17 11:49:57

标签: mongodb api rest go

您好我正在尝试为我正在构建的REST API构建基础框架。我喜欢有一个BaseController与常规CRUD操作。我想为每个控制器定义一个模型。我认为我的方法相当不错,唯一仍然似乎不起作用的是每个组件的初始化。我收到了这个错误:

too few values in struct initializer

cannot use Model literal (type Model) as type User in array element

我的方法:

type Model struct {
    Id *bson.ObjectId
}

type Controller struct {
    model *Model
    arrayOfModels *[]Model
}

然后例如:

type User struct {
    Model
    someField string
}

type UserController struct {
    Controller
}

func NewUserController() UserController {
    return UserController{Controller{
         model: &User{Model{Id: nil}},
         arrayOfModels: &[]User{Model{Id: nil}},
    }}
}

我将这个API与Mgo(MongoDB适配器)一起使用,因此我使用了bson.ObjectId

我想知道我做错了什么,如果我应该使用这种方法,那可能会更好。

非常感谢帮助。

Sjors

1 个答案:

答案 0 :(得分:1)

  

我想知道我做错了什么

User不是Model,用于嵌入Model。您无法使用User类型的值,其中需要Model

Go中的多态性是通过接口完成的,而不是嵌入。

另外,你正在尝试继承; Go不支持继承 - 忘记继承。这也意味着忘记你所知道的MVC。

此外,您正在使用指向所有内容的指针。唐'吨;指针是昂贵的,因为如果它转义为一个简单的块作用域,则指向的值将在堆而不是堆栈上分配。在更复杂的情况下,更难以推理指针。

你需要一个范式转换,不要试图将你的" OO" -expertise应用到Go。而是阅读文档,阅读其他代码并学习如何在Go中思考。