Golang中多个if代码优化小技巧

 更新时间:2023年10月05日 11:17:06   作者:yunyi  
这篇文章主要为大家详细介绍了Golang中一些常用的if代码优化小技巧,w文中的示例代码简洁易懂,具有一定的借鉴价值,感兴趣的小伙伴可以跟随小编一起学习一下

没优化之前: 嵌套if, 检查是否有中文字段值, 否则去查找英文值, 都没有则返回默认值

if record.City.Names["zh-CN"] == "" {
	city = record.City.Names["en"]
	if record.City.Names["en"] == "" {
		city = record.City.Names["en"]
	}
} else {
	city = "未知地域"
}

优化后: 平级if...else代替嵌套if

if name, ok := record.City.Names["zh-CN"]; ok {
	city = name
} else if city, ok = record.City.Names["en"]; ok {
	city = record.City.Names["en"]
} else {
	city = "未知地域"
}

知识点: 利用go的ok模式,对查询map对象的值是否存在更加简洁和安全

更进一步的优化, 去掉else

这对else的处理逻辑有明确的值时非常有用

city = "未知地域"
if name, ok := record.City.Names["zh-CN"]; ok {
	city = name
} else if name, ok = record.City.Names["en"]; ok {
	city = name
}

使用switch代替多个if分支: 根据成绩的分数段给出对应的等级

func calculateGrade(score int) string {
	var grade string
	if score >= 90 && score <= 100 {
		grade = "A"
	} else if score >= 80 && score < 90 {
		grade = "B"
	} else if score >= 70 && score < 80 {
		grade = "C"
	} else if score >= 60 && score < 70 {
		grade = "D"
	} else if score >= 0 && score < 60 {
		grade = "F"
	} else {
		grade = "Invalid Score"
	}
	return grade
}

优化后: 使代码更加简洁,并且避免了多个嵌套的 if-else 语句。同时,使用 switch 语句还能够处理默认情况,即当 score 不满足任何一个分支条件时,默认返回 "Invalid Score"

func calculateGrade(score int) string {
	var grade string
	switch {
	case score >= 90 && score <= 100:
		grade = "A"
	case score >= 80 && score < 90:
		grade = "B"
	case score >= 70 && score < 80:
		grade = "C"
	case score >= 60 && score < 70:
		grade = "D"
	case score >= 0 && score < 60:
		grade = "F"
	default:
		grade = "Invalid Score"
	}
	return grade
}

错误检查

首先看etcdgithub官网的错误处理例子:

resp, err := cli.Put(ctx, "", "")
if err != nil {
	switch err {
	case context.Canceled:
		log.Fatalf("ctx is canceled by another routine: %v", err)
	case context.DeadlineExceeded:
		log.Fatalf("ctx is attached with a deadline is exceeded: %v", err)
	case rpctypes.ErrEmptyKey:
		log.Fatalf("client-side error: %v", err)
	default:
		log.Fatalf("bad cluster endpoints, which are not etcd servers: %v", err)
	}
}

我们可以进一步优化, 使用go自带的包errors对错误类型进行更加健壮的检查, 但是对开发者的要求较高, 需要预定义正确的错误类型, 来保证正确的比较错误

resp, err := cli.Put(ctx, "", "")
if err2 != nil {
		switch {
		case errors.Is(err, context.Canceled):
			log.Fatalf("ctx is canceled by another routine: %v", err)
		case errors.Is(err, context.DeadlineExceeded):
			log.Fatalf("ctx is attached with a deadline is exceeded: %v", err)
		case errors.Is(err, rpctypes.ErrEmptyKey):
			log.Fatalf("client-side error: %v", err)
		default:
			log.Fatalf("bad cluster endpoints, which are not etcd servers: %v", err)
		}
	}

到此这篇关于Golang中多个if代码优化小技巧的文章就介绍到这了,更多相关go if优化内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 利用 Go 语言编写一个简单的 WebSocket 推送服务

    利用 Go 语言编写一个简单的 WebSocket 推送服务

    这篇文章主要介绍了利用 Go 语言编写一个简单的 WebSocket 推送服务,需要的朋友可以参考下
    2018-04-04
  • 深入分析golang多值返回以及闭包的实现

    深入分析golang多值返回以及闭包的实现

    相对于C/C++,golang有很多新颖的特性,例如goroutine,channel等等,这些特性其实从golang源码是可以理解其实现的原理。今天这篇文章主要来分析下golang多值返回以及闭包的实现,因为这两个实现golang源码中并不存在,我们必须从汇编的角度来窥探二者的实现。
    2016-09-09
  • Golang unsafe.Sizeof函数代码示例使用解析

    Golang unsafe.Sizeof函数代码示例使用解析

    这篇文章主要为大家介绍了Golang unsafe.Sizeof函数代码示例使用解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12
  • Go语言实现分布式锁

    Go语言实现分布式锁

    分布式锁是控制分布式系统之间同步访问共享资源的一种方式。如果不同的系统或是同一个系统的不同主机之间共享了一个或一组资源,那么访问这些资源时,需要通过一些互斥手段来防止彼此之间的干扰以保证一致性,在这种情况下,就需要使用分布式锁了
    2023-01-01
  • 浅析golang开发Error的使用详解

    浅析golang开发Error的使用详解

    Error是Go语言开发中最基础也是最重要的部分,很多朋友不明白goland error的一些基本使用方法,今天通过本文给大家详细介绍下,需要的朋友参考下吧
    2021-07-07
  • 源码分析Golang log是如何实现的

    源码分析Golang log是如何实现的

    go语言的log包提供了简单的日志记录功能,允许开发者在应用程序中记录重要的信息、错误、警告等,log包是Go标准库的一部分,因此,使用它不需要安装额外的第三方库,本文给大家源码分析了Golang log是如何实现的,需要的朋友可以参考下
    2024-03-03
  • GO语言判断一个网段是否属于另一个网段的子网

    GO语言判断一个网段是否属于另一个网段的子网

    这篇文章主要介绍了GO语言判断一个网段是否属于另一个网段的子网的相关资料,内容介绍详细,具有一定的参考价值,需要的朋友可任意参考一下
    2022-03-03
  • Golang 数据库操作(sqlx)和不定字段结果查询

    Golang 数据库操作(sqlx)和不定字段结果查询

    本文主要介绍了Golang 数据库操作(sqlx)和不定字段结果查询,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • go语言中for range使用方法及避坑指南

    go语言中for range使用方法及避坑指南

    Go中的for range组合可以和方便的实现对一个数组或切片进行遍历,但是在某些情况下使用for range时很可能就会被"坑",下面这篇文章主要给大家介绍了关于go语言中for range使用方法及避坑指南的相关资料,需要的朋友可以参考下
    2022-09-09
  • Golang WebSocket创建单独会话详细实例

    Golang WebSocket创建单独会话详细实例

    这篇文章主要给大家介绍了关于Golang WebSocket创建单独会话的相关资料,WebSocket 协议主要为了解决基于 HTTP/1.x 的 Web 应用无法实现服务端向客户端主动推送的问题,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2023-11-11

最新评论