共计 2063 个字符,预计需要花费 6 分钟才能阅读完成。
大家好,我是煎鱼。
这是一个很多其余语言工程师转 Go 语言的工夫节点,这就不免不管一番比拟。其中一个经典的运算上的就是“三元运算符”:
为什么 Go 语言不反对三元运算符,Go 不反对三元运算符就是设计的不好,是历史在开倒车吗?
明天就由煎鱼来和大家一起摸索为什么。
三元运算符是什么
三元运算符,在典型的数学意义上,或者从解析器的角度来看,是一个须要三个参数的运算符。而咱们日常中,最常见的是二元运算符:
x + y
x / y
x * y
还有一元运算符:
-a
~b
!c
以及明天的男主角“三元运算符”。在 C/C++ 等多种语言中,咱们能够依据条件申明和初始化变量的习惯来选择性应用三元条件运算符:
int index = val > 0 ? val : -val
Go 应用三元运算符
想在 Go 语言里也应用三元运算符时,发现竟然没有 … 想要实现与下面雷同的代码段的形式仿佛只能:
var index int
if val > 0 {index = val} else {index = -val}
看上去非常的冗余,不够简洁。
为什么 Go 没有三元运算符
为什么 Go 没有 ?:
操作符,没有的话,官网举荐的形式是怎么样的。
通过 Go FAQ 咱们能够得悉:
Go 官网就是举荐咱们应用后面提到的形式来代替,并且明确了如下态度:
- Go 中没有
?:
的起因是语言的设计者看到这个操作常常被用来创立难以了解的简单表达式。 - 在代替计划上,if-else 模式尽管较长,但无疑是更清晰的。一门语言只须要一个条件控制流构造。
整体来讲,Go 语言的设计者是为了思考 可读性 回绝了实现三元运算符,”less is more.” 也是标榜台词了。
社区争议
Go 语言的一些点不同凡响,根本是大家皆知的。无论是 if err != nil,又或是本次的三元运算符,要大家用 if-else 代替:
if expr {n = trueVal} else {n = falseVal}
拥护和批准
拥护
因而有社区小伙伴给出了拥护,根本分为如下几类:
- 认为 if-else 也有以相似状况能被滥用,设计者的理由不够充沛,认为是“借口”。
- 认为三元运算符的“俊俏”问题,是开发者的编码问题,而不是语言问题。三元在各种语言中很常见,它们是失常的,Go 语言也应该要有。
- 认为用 if-else 代替三元运算符也很麻烦,让开发者多读了 3-4 行和额定的缩进级别。
批准
认可这个决策的也有不少,为此给出了大量的实在工程案例。
一般来讲,咱们用三元运算符是心愿这么用:
cond ? true_value : false_value
你可能见过这么用:
cond ? value_a + value_b : value_c * value_d
还见过这样:
(((cond_a ? val_one) : cond_b) ? val_two) : val_three
cond_a ? (val_one : (cond_b ? (val_two : val_three)))
还能嵌套三元运算符:
int a = cond_a ? val_one :
cond_b ? val_two :
cond_c ? val_three : val_four;
也能呈现可读性更差的:
void rgb_to_lightness_(const double re, const double gr, const double bl, double &li)
{li=((re < gr) ? ((gr < bl) ? bl : gr) : ((re < bl) ? bl : re) +
(gr < re)
? ((bl < gr) ? bl : gr)
: ((bl < re) ? bl : re)) / 2.0;
}
说白了就是实在的代码工程中,大家见到过大量三元运算符滥用的场景,纷纷给出了大量的难了解的例子,让大家困扰不堪。
总结
在这篇文章中,首先针对“三元运算符”做了根本的介绍。紧接着依据 Go 语言不反对三元的态度进行了阐明,且面向社区的争议咱们分为了正反方面的根本诠释。
实际上一个简略的 ?:
既整洁又实用,然而没有很好又高效的方法办法能够避免俊俏的嵌套,也就是排除可读性的问题。
在实在的业务工程中,经常能看到一个三元运算符,一开始只是很简略。前面嵌套越加越深,逻辑越写越简单,从而带来了许多保护上的问题。
给大家抛出如下问题:
- 你认为 Go 语言是否要有三元运算符呢?
- 如果要有,简单嵌套的三元运算符又如何思考呢?
欢送大家在评论区留言和交换:)
若有任何疑难欢送评论区反馈和交换,最好的关系是相互成就 ,各位的 点赞 就是煎鱼创作的最大能源,感激反对。
文章继续更新,能够微信搜【脑子进煎鱼了】浏览,本文 GitHub github.com/eddycjy/blog 已收录,学习 Go 语言能够看 Go 学习地图和路线,欢送 Star 催更。