【发布时间】:2020-08-14 20:42:26
【问题描述】:
首先,我想向您介绍一下,因为我觉得我缺少一些核心 Golang 概念。
在我的应用程序中,许多模型都有一个名为 GetByUserId 的方法。我创建了需要此方法的接口(UserCreatedEntity),因此我将能够为每种类型的记录创建控制器的 GetUserRecords 方法工厂,只需:
router.Handle("/ideas/mine",
middlewares.AuthUser(controllers.GetMineFactory(&models.Idea{}))).Methods("POST")
router.Handle("/votes/mine",
middlewares.AuthUser(controllers.GetMineFactory(&models.Vote{}))).Methods("POST")
router.Handle("/someNewType/mine",
middlewares.AuthUser(controllers.GetMineFactory(&models.SomeNewType{}))).Methods("POST")
这就是我的界面的样子:
type UserCreatedEntity interface {
GetByUserId(userId uint) []UserCreatedEntity
}
及实施:
func (idea *Idea) GetByUserId(userId uint) []UserCreatedEntity {
ideas := []Idea{}
GetDB().
Table("ideas").
/** Query removed to make code less confusing **/
Scan(ideas)
return ideas
}
显然,它不起作用(带有指针切片的版本也不起作用)。问题是——如果我只返回一条记录,这段代码就可以工作——就像那样(显然也改变了接口中的签名):
func (idea *Idea) GetByUserId(userId uint) UserCreatedEntity {
idea := &Idea{}
GetDB().
Table("ideas").
/** Query removed to make code less confusing **/
First(idea)
return idea
}
如何让它像切片一样工作?正如我所说,我怀疑我错过了一些重要的知识。如此深入的解释会很棒。
解决方案:
func (idea *Idea) GetByUserId(userId uint) []UserCreatedEntity {
ideas := []*Idea{}
GetDB().
Table("ideas").
Select("problems.name AS problem_name, ideas.id, ideas.problem_id, ideas.action_description, ideas.results_description, ideas.money_price, ideas.time_price, ideas.is_published").
Joins("INNER JOIN problems ON ideas.problem_id = problems.id").
Where("ideas.user_id = ?", userId).
Scan(&ideas)
uces := make([]UserCreatedEntity, len(ideas))
for i, idea := range ideas {
uces[i] = idea
}
return uces
}
【问题讨论】:
-
将
idea的元素复制到[]UserCreatedEntity:每个*Idea都可以分配给一个UserCreatedEntity。 -
不要称它们为“数组”...