gpt4 book ai didi

go - 简化 Go 代码

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

我有两个函数,如下所示,它们看起来很相似,但使用不同的函数来查询数据库。由于 Go 不鼓励重载方法,冗余是否可以接受?还是我应该将它们重构为一个函数?欢迎所有评论。

var getCustomers = func() ([]customer, error) {
return nil, nil
}

var getCustomerById = func(int64) (*customer, error) {
return nil, nil
}

func listCustomer(w http.ResponseWriter, r *http.Request) *appError {
cus, err := getCustomers()
if err != nil {
return &appError{err, "No customer found", 404}
}

res, err := json.Marshal(cus)

if err != nil {
return &appError{err, "Can't display record", 500}
}

fmt.Fprint(w, string(res))
return nil
}

func viewCustomer(w http.ResponseWriter, r *http.Request, id int64) *appError {
cus, err := getCustomerByID(id)
if err != nil {
return &appError{err, "No customer found", 404}
}

res, err := json.Marshal(cus)

if err != nil {
return &appError{err, "Can't display record", 500}
}

fmt.Fprint(w, string(res))
return nil
}

建议使用 -1 列出所有客户,但我不确定这是否是最好的:

func viewCustomer(w http.ResponseWriter, r *http.Request, id int64) *appError {
var c *customer
var clist []customer
var err error

if id < 0 {
clist, err = getCustomers()
res, err := json.Marshal(clist)

if err != nil {
return &appError{err, "Can't display record", 500}
}

fmt.Fprint(w, string(res))
return nil
} else {
c, err = getCustomerById(id)
res, err := json.Marshal(c)

if err != nil {
return &appError{err, "Can't display record", 500}
}

fmt.Fprint(w, string(res))
return nil
}
}

最佳答案

Since Go doesn't encourage overloaading methods, is the redundancy acceptable? Or should I refactor them into one function?

您问题的答案在很大程度上取决于实际代码和您的任务。如果列出一个客户与列出多个客户有很大不同(也就是说,您需要不同的信息并且具有不同的呈现逻辑),我会说这里的重复并不是那么糟糕,因为将来差异可能会变得更大,所以DRY 解决方案可能会很快变成 ifswitch 困惑。 (我在非 Go 项目上有过类似的经历,从那时起我认为 DRY 很好,但你不应该对它狂热。)

另一方面,如果您正在制作,比如说一个 JSON API,您可以让它更 DRY。像这样定义您的 getCustomers 函数:

func customers(ids ...int64) ([]customer, error) { /* ... */ }

这样你就可以:

  • customers() 一样调用它并获取所有客户;
  • 调用customers(42),得到一个ID为42的客户;
  • 调用 customers(someIDs...) 并通过他们的 ID 获取多个客户。

所有这些都可以在一个处理程序中以一种直接的方式完成。

All comments are welcomed.

代码中的两个问题:

  • Go 中的 Getter 方法习惯上命名为 foo 而不是 getFoo,所以我在示例中使用了 customers。您很可能将其称为 DB.Customers(ids...),因此它看起来很像一个 getter 方法。

  • var foo = func() 符号有什么用?除非有理由这样做(比如将这些函数用作闭包),否则我建议坚持使用 func foo() 表示法,因为它更惯用并且通常更容易 grep编辑: 正如 OP 在评论中指出的那样,var foo = func() 符号的另一种情况当然是可以在测试中伪造的函数,如 Andrew Gerrand 中所示Testing Techniques talk .

希望对您有所帮助。

关于go - 简化 Go 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25947211/

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