gpt4 book ai didi

Golang 虹膜 : Initialize parent controller's model to child controller's model

转载 作者:IT王子 更新时间:2023-10-29 02:10:40 27 4
gpt4 key购买 nike

我知道 Go 不是一种面向对象的语言,但我正在尝试按照 this 的建议在我的 Iris Controller 中实现一个继承结构。文章。我这样做的主要动机是避免重复。到目前为止,它一直在为我工作。例如,看看下面的代码。

// 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())
}

如您所见,APIController 期望类型为 Models.Model,而 UserController 正在传递 *Models.User。最终目标是在 APIController 中拥有一个通用模型,该模型来自任何 Controller ,然后能够调用 Models.Model 中定义的所有函数,这样我就不必在任何地方调用这些函数。

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

更新

通过使用继承和单父模型并在父 APIController 中使用它,我想避免复制我的过滤器/CRUD 逻辑。例如,在 UserController 中,如果我想保存一条记录,那么不要在 UserController 中使用 User.Save(input_data)Save 最好在 Models.ModelAPIController 中定义,我可以调用 Model.Save(input_data) 而不是分别从子 Controller 进行相同的调用。

最佳答案

首先使 Model 成为接口(interface)而不是结构。让它包含所有模型应该通用的所有方法:

type Model interface {
// Common methods
}

然后,只要User实现了所有这些方法,你就可以拥有

c.APIController.Model = new(Models.User) // Now works!

Save 是常用方法之一。否则使 Save 成为非方法:

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

关于Golang 虹膜 : Initialize parent controller's model to child controller's model,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47982478/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com