大家好,我是炸鱼。这是很多其他语言工程师转向Go语言的时间点,所以难免忽略一些对比。其中一个经典的计算就是“三元运算符”:为什么Go语言不支持三元运算符?如果Go不支持三元运算符,那是因为设计不好。历史在倒退吗?今天炸鱼就来和大家一起探个究竟。什么是三元运算符?在典型的数学意义上,或者从解析器的角度来看,三元运算符是采用三个参数的运算符。在我们的日常生活中,最常见的就是二元运算符:x+yx/yx*y和一元运算符:-a~b!c以及今天的主人公“三元运算符”。在C/C++等很多语言中,我们可以根据条件声明和变量初始化的习惯,选择性地使用三元条件运算符:intindex=val>0?val:-val当我同样使用三元运算符时,我发现没有...实现与上面相同代码段的唯一方法似乎是:varindexintifval>0{index=val}else{index=-val}看起来很多余而且不够简洁。为什么Go没有三元运算符?为什么Go没有?:运算符?如果不是,官方推荐的方式是什么?通过GoFAQ,我们可以知道Go官方是建议我们改用上面提到的方法,并阐明了以下态度:NoinGo?:原因是语言设计者看到这个操作经常被用来创建难以理解的复杂表达式。另一方面,if-else形式虽然更长,但肯定更清晰。一种语言只需要一个条件控制流结构。总的来说,Go语言的设计者为了可读性,拒绝实现三元运算符,“少即是多”。也是一种炫耀的行。社区争论Go语言的一些点不一样,基本都是大家熟知的。不管是iferr!=nil,还是这次的三元运算符,大家应该改用if-else:ifexpr{n=trueVal}else{n=falseVal}objectandagreetoobject,所以有社区小伙伴给出了异议,基本上分为以下几类:类似情况下if-else可以被滥用,设计者的理由不充分,算是“借口”。将三元运算符的“丑陋”视为开发人员的编码问题,而不是语言问题。Tern在各种语言中都很常见,很正常,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_threecond_a?(val_one:(cond_b?(val_two:val_three)))也可以嵌套三元运算符:inta=cond_a?val_one:cond_b?val_two:cond_c?val_three:val_four;可读性较差:voidrgb_to_lightness_(constdoublere,constdoublegr,constdoublebl,double&li){li=((re
