Golang Iris:初始化父控制器';s模型到子控制器';s模型

Golang Iris:初始化父控制器';s模型到子控制器';s模型,go,go-iris,Go,Go Iris,我知道Go不是一种面向对象的语言,但我正试图在我的Iris控制器中实现一种继承结构,正如本文所建议的那样。我这样做的主要动机是避免重复。到目前为止,它一直在为我工作。以下面的代码为例 // APIController.go (package Controllers) type APIController struct { mvc.C } func (c *APIController) Post(data map[string][]string) ([]byte, error) {

我知道Go不是一种面向对象的语言,但我正试图在我的Iris控制器中实现一种继承结构,正如本文所建议的那样。我这样做的主要动机是避免重复。到目前为止,它一直在为我工作。以下面的代码为例

// APIController.go (package Controllers)
type APIController struct {
    mvc.C
}
func (c *APIController) Post(data map[string][]string) ([]byte, error) {
    data_parsed := c.ParseFormData(data)
    return json.Marshal(data_parsed)
}

// UserController.go  (package Controllers)
type UserController struct {
    mvc.C
    *APIController
}

func (c *UserController) Post() ([]byte, error) {
    return c.APIController.Post(c.Ctx.FormValues())
}
到目前为止还不错

但我发现很难在模型上复制相同的策略。这就是我到目前为止所做的

// Model.go (package Models)
type Model struct {
    Id         string `json:"_id"`
    Created_at string `json:"created_at"`
    Updated_at string `json:"updated_at"`
    Deleted_at string `json:"deleted_at"`
}
// implements further set of functions to be used by 'child' models...

// User.go (package Models)
type User struct {
    *Model

    First_name string `json:"first_name"`
    Last_name  string `json:"last_name"`
    Email      string `json:"email"`
    Username   string `json:"username"`
    Password   string `json:"password"`
    Last_login string `json:"last_login"`
}


// APIController.go (package Controllers)
type APIController struct {
    mvc.C
    Model Models.Model
}

// UserController.go  (package Controllers)
type UserController struct {
    mvc.C
    *APIController
}

func (c *UserController) Post() ([]byte, error) {
    c.APIController.Model = new(Models.User) //WRONG!
    return c.APIController.Post(c.Ctx.FormValues())
}
如您所见,当UserController传递
*Models.User
时,APIController需要类型
Models.Model
。最终目标是在APIController中拥有一个通用模型,该模型可以从任何控制器调用任何模型,然后能够调用Models.model中定义的所有函数,这样我就不必到处调用这些函数

有可能吗?如果不是,那么避免重复代码的最佳方法是什么

更新


通过使用继承和单亲模型,并在parent
APIController
中使用它,我希望避免复制我的过滤器/积垢逻辑。例如,在
UserController
内部,如果我想保存一条记录,那么我可以在
Models.Model
内部调用
Model.save,而不是在
UserController
内部使用
User.save(输入数据)
,理想情况下,
save
应该在
Models.Model
内部定义
而不是单独从子控制器发出相同的调用。

首先创建
模型
接口,而不是结构。使其包含所有模型通用的所有方法:

type Model interface {
    // Common methods
}
然后,只要
User
实现了所有这些方法,您就可以

c.APIController.Model = new(Models.User) // Now works!
常用的方法之一是
Save
。否则,将
保存
设为非方法:

func Save(m Model) error {
    ...
}

我知道你想
c.APIController.Model
包含任何类型的模型,但是你想如何使用该模型?@md2perpe更新了这个问题以便精确使用。我一直在尝试将
APIController.Model
定义为
接口{}
,但该方法有其缺点。你的似乎是更好的选择。