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语言常见错误之意外的变量隐藏

    如何避免Go语言常见错误之意外的变量隐藏

    在Go语言中,变量隐藏(Variable Shadowing)是一个常见的错误来源,变量隐藏发生在一个内部作用域中声明的变量与外部作用域的变量同名时,这可能导致开发者无意中使用了错误的变量,造成难以追踪的bug,本文讲解一些关于变量隐藏的常见错误和如何避免它们的方法
    2024-01-01
  • Golang单元测试、go协程和管道示例详解

    Golang单元测试、go协程和管道示例详解

    在Go语言中并发编程是一种核心特性,这篇文章主要介绍了Golang单元测试、go协程和管道的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-11-11
  • Go语言基础学习教程

    Go语言基础学习教程

    这篇文章主要介绍了Go语言基础知识,包括基本语法、语句、数组等的定义与用法,需要的朋友可以参考下
    2016-07-07
  • Golang 获取系统信息的实现

    Golang 获取系统信息的实现

    本文主要介绍了Golang 获取系统信息的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • Web框架Gin中间件实现原理步骤解析

    Web框架Gin中间件实现原理步骤解析

    这篇文章主要为大家介绍了Web框架Gin中间件实现原理步骤解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-10-10
  • 详解Opentelemetry Collector采集器

    详解Opentelemetry Collector采集器

    这篇文章主要为大家介绍了Opentelemetry Collector神秘的采集器详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • Goland中Protobuf的安装、配置和使用

    Goland中Protobuf的安装、配置和使用

    本文记录了mac环境下protobuf的编译安装,并通过一个示例来演示proto自动生成go代码,本文使用的mac os 12.3系统,不建议使用homebrew安装,系统版本太高,会安装报错,所以自己下载新版压缩包编译构建安装
    2022-05-05
  • go实现thrift的网络传输性能及需要注意问题示例解析

    go实现thrift的网络传输性能及需要注意问题示例解析

    这篇文章主要为大家介绍了go实现thrift的网络传输性能及需要注意问题示例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • golang值类型转换成[]uint8类型的操作

    golang值类型转换成[]uint8类型的操作

    这篇文章主要介绍了golang值类型转换成[]uint8类型的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-05-05
  • Golang实现Json转结构体的示例详解

    Golang实现Json转结构体的示例详解

    这篇文章主要为大家详细介绍了Golang实现Json转结构体的方法,文中的示例代码讲解详细,对学习Go语言有一定的帮助,需要的可以参考一下
    2023-02-02

最新评论