gpt4 book ai didi

Golang 避免代码重复

转载 作者:IT王子 更新时间:2023-10-29 01:41:34 24 4
gpt4 key购买 nike

目前我有两个结构。

type One struct {
Name string
Age int
ID int
Owner string
}

type Two struct {
ID int
Make string
Bags string
Age int
Owner string
}

这些结构映射到数据库中的表,我使用一个接口(interface)来提供对数据库和内容的访问。在这种情况下,只是基于所有者的一和二中的数据列表。

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.GetAllinterface{} 作为它的第二个参数,它看起来是这样,实际上您可以将其 DRY 出来:

func (db *DB) dryGet(owner, table string, result interface{}) error {
q := db.NewQuery(table).Filter("Owner =", owner).Order("Name")
keys,err := db.client.GetAll(q, &result)
return err
}

将结果转换为 map 有点困难,因为 Go 缺少泛型,并且您的结构没有可用于连接它们的方法。这是可能的,但至少需要在每种类型上创建一个 getID 方法,创建一个 hasID 接口(interface),然后返回一个 map[int]hasID,然后调用者必须将其值转换回结构类型才能访问任何其他字段。不是最优的,但可行。但是,上述解决方案至少可以让您消除很大一部分重复代码。

关于Golang 避免代码重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43456418/

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