重学 Golang: Switch | 青训营笔记

105 阅读2分钟

起因

在快速入门的时候学的 switch 总是会很容易忘, 因为学起来也简单, 而且Golang的循序也很简单, 大多数的任务也能够使用 if else 完成, 渐渐的就忘掉了, 现在重温课程, 发现 switch 的能力还是挺强的, 然后发现自己做的玩具都是 if else 分支, 还有的嵌套if, 看起来不够直观, 就使用switch来对玩具进行优化

优化

使用 switch 去掉多if分支

优化前:

使用if先判断queryErr是否有 error

Ture: 返回请求数据

False:

  1. 错误则返回客户端请求错误
  2. 查询失败则返回没有对应的信息的 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 之后更加的简洁, 将嵌套结构打平, 更加的直观