【发布时间】:2017-04-17 17:34:29
【问题描述】:
目前我有两个结构。
type One struct {
Name string
Age int
ID int
Owner string
}
type Two struct {
ID int
Make string
Bags string
Age int
Owner string
}
这些结构映射到数据库中的表,我使用接口来提供对数据库和内容的访问。在这种情况下,只是基于所有者的一号和二号中的数据列表。
type dbInterface interface {
ListOnesByOwner(owner string) ([]*One, error)
LitsTwosByOwner(owner string) ([]*Two, error)
}
列表功能是相同的,除了结构。
func (db *DB) ListOnes(owner string) ([]*One, error) {
ones = make([]*One, 0)
q := db.NewQuery("One").
Filter("Owner =", owner).
Order("Name")
keys, err := db.client.GetAll(q, &ones)
for i, k := range keys {
ones[i].ID = k.ID
}
return ones, nil
}
func (db *DB) ListTwos(owner string) ([]*Two, error) {
twos = make([]*Two, 0)
q := db.NewQuery("Two").
Filter("Owner =", owner).
Order("Name")
keys, err := db.client.GetAll(q, &twos)
for i, k := range keys {
twos[i].ID = k.ID
}
return twos, nil
}
func main() {
ones, err := DB.ListOnesByOwner(user.ID)
twos, err := DB.ListTwosByOwner(user.ID)
}
我对 GO 还很陌生,所以我想知道减少此处看到的代码重复的惯用方法是什么?如果我要添加更多的结构,那将是笨拙的,因为需要大量的代码重复。
感谢您的帮助!
【问题讨论】:
-
在我发布答案之前,我有一个问题。
db.client.GetAll的第二个参数是inteface{}吗? -
我投票结束这个问题,因为这个问题属于codereview.stackexchange.com
-
@PaulHankin 他不是要求进行一般性的代码审查,而是询问有关如何使用 Go 语言的具体问题。对我来说似乎是合法的。
-
您能否分享一下您正在使用的实现
db.client.GetAll方法/功能的包?从外观上看,您可能根本不需要遍历键,因为您已经传递了一个指向“目标”值的指针......因此我假设GetAll为您填写了它的第二个参数并且返回的键仅供参考,不一定非要使用...例如google.golang.org/appengine/datastore非常相似的*Query.GetAll方法就是这样工作的。 -
@mkopriva 我正在使用数据存储包
标签: go code-duplication