起因
在快速入门的时候学的 switch 总是会很容易忘, 因为学起来也简单, 而且Golang的循序也很简单, 大多数的任务也能够使用 if else 完成, 渐渐的就忘掉了, 现在重温课程, 发现 switch 的能力还是挺强的, 然后发现自己做的玩具都是 if else 分支, 还有的嵌套if, 看起来不够直观, 就使用switch来对玩具进行优化
优化
使用 switch 去掉多if分支
优化前:
使用if先判断queryErr是否有 error
Ture: 返回请求数据
False:
- 错误则返回客户端请求错误
- 查询失败则返回没有对应的信息的
json
// 判断查询结果
if queryErr != nil {
// 判断是否没有对应的信息
if errors.Is(mongo.ErrNoDocuments, queryErr) {
log.Printf("请求%s失败,没有对应的信息, 错误原因:%s", collectionName, queryErr.Error())
return schema.Status{
Code: 400,
Message: fmt.Sprintf("请求%s失败,没有对应的信息, 错误原因:%s", collectionName,
queryErr.Error()
),
Body: nil,
}, queryErr
}
// 其他错误
return schema.Status{
Code: 404,
Message: fmt.Sprintf("请求%s失败,错误原因:%s", collectionName, queryErr.Error()),
Body: nil,
}, queryErr
}
return schema.Status{
Code: 200,
Message: fmt.Sprintf("请求%s成功", collectionName),
Body: result,
}, queryErr
优化后:
直接判断queryErr的返回值类型, 如果是查询失败则返回没有对应的信息的 json, 错误则返回客户端请求错误,成功则返回查询结果
switch {
case errors.Is(queryErr, mongo.ErrNoDocuments):
log.Printf("请求%s失败,没有对应的信息, 错误原因:%s", collectionName, queryErr.Error())
return schema.Status{
Code: 400,
Message: fmt.Sprintf("请求%s失败,没有对应的信息, 错误原因:%s", collectionName, queryErr.Error()),
Body: nil,
}, queryErr
// 返回查询结果
case queryErr == nil:
return schema.Status{
Code: 200,
Message: fmt.Sprintf("请求%s成功", collectionName),
Body: result,
}, queryErr
default:
return schema.Status{
Code: 404,
Message: fmt.Sprintf("请求%s失败,错误原因:%s", collectionName, queryErr.Error()),
Body: nil,
}, queryErr
}
可以看出, 使用 switch 之后更加的简洁, 将嵌套结构打平, 更加的直观