时间:2021-05-22
golang并没有像C语言一样提供三元表达式。三元表达式的好处是可以用一行代码解决原本需要多行代码才能完成的功能,让冗长的代码瞬间变得简洁。不过对于新手来说,建议还是少用三元表达式。在这里,我用golang通过函数的方式实现了三元表达式。
官方FAQ推荐的做法是用 if 代替:
if expr { n = trueVal} else { n = falseVal}不过用 if 的问题是变量 n 有作用域问题. 我们需要在 if 之前先定义变量 n,这样才可以在 if 语句之后使用变量 n。
var n intif expr { n = trueVal} else { n = falseVal}println(n)本来一个简单的 n := expr? trueVal: falseVal 就能够表达的问题,变的复杂了很多。 这和Go所追求的简单思路是有冲突的。
类似的有 max/min 等函数。因为这类函数使用频度比较高,在很多pkg的内部都定义了私有的实现。
func max(a, b int) int { if a < b { return b } return a}熟悉Go语言的用户应该可以发现,这个 max 只支持 int 类型。 对于支持泛型的C++语言来说,max 一般被实现为一个模板函数:
template <class T>const T& max (const T& a, const T& b) { return (a<b)?b:a; // or: return comp(a,b)?b:a; for version (2)}在C++版本中,不仅用到的泛型T,还依赖 a<b 的运算符重载特性。 在C语言中,虽然没有泛型和运算符重载,但是三元表达式也具备全部的特性(因为表达式天生就是支持泛型的)。
而这些都是Go语言中缺少的特性。 不过在Go语言中可以模拟一个更普通的函数(If 的首字母大写,是函数名,不是 if 关键字):
func If(condition bool, trueVal, falseVal interface{}) interface{} { if condition { return trueVal } return falseVal} a, b := 2, 3max := If(a > b, a, b).(int)println(max)有几个关键点:
由此可见,?: 不仅仅是一个简单的三元表达式。其实它更像一个内置的泛型版的函数(因为表达式天生就是支持泛型的)。
期望未来的Go版本中,能完善对 ?: 三元表达式 和 编译时的泛型 的支持。
补充: 星星 同学的提示:可能会导致深入嵌套的滥用: c?d?e?0:1:2:3 。 因为三元表达式是一个表达式,必然是允许嵌套的。
不过我觉得嵌套不是问题的本质,函数也能导致嵌套的滥用。 但是不能因为滥用的行为来排斥有存在价值的语法(比如三元表达式)。
执行结果
到此这篇关于golang三元表达式的使用方法的文章就介绍到这了,更多相关golang三元表达式内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
这是今天在温习lambda表达式的时候想到的问题,众所周知C系列语言中的三元运算符(?:)是一个非常好用的语句,关于C中的三元运算符表达式1?表达式2:表达式3
三目运算符也就是三元运算符一些语言(如Java)的三元表达式形如:判定条件?为真时的结果:为假时的结果result=xifxPython的三元表达式有如
条件表达式条件表达式也称为三元表达式,表达式的形式:xifCelsey。流程是:如果C为真,那么执行x,否则执行y。经过测试x,y,C可以是函数,表达式,常量等
三元条件判断的3种实现方法C语言中有三元条件表达式,如a>b?a:b,Python中没有三目运算符(?:),但Python有它自己的方式来实现类
C#操作符之三元操作符“?:”是什么呢?C#操作符之三元操作符“?:”有时也称为条件操作符。对条件表达式b?x:y,先计算条件b,然后进行判断。如果b的值为tr