go 为什么没有三元表达式?
2022-03-28 本文已影响0人
wayyyy
go 为什么没有三元表达式?
Go 中没有 ?: 的原因是语言的设计者看到这个操作经常被用来创建难以理解的复杂表达式。(多层嵌套)
在替代方案上,if-else 形式虽然较长,但无疑是更清晰的,一门语言只需要一个条件控制流结构。
-
简单造个三元运算符
func IFTHEN(expr bool, a, b interface{}) interface{} { if expr { return a } return b }
缺点是返回了万能类型 interface{},每次使用都需要断言,不方便性能还差。
-
利用go 1.18 之后的泛型
func IFTHEN[T any](expr bool, a, b T) T { if expr { return a } return b }
这个版本看起来解决了上述的问题,但如果
var p *Person genderDesc := IFTHEN(p == nil, "未知", Any(p.gender == 1, "男", "女")) // panic
以上示例将无可避免地发生 panic ,原因是当
p == nil
成立时,p.gender
将发生 panic 。相信肯定会有人觉得奇怪,明明在访问 gender 字段前已经做了判空操作,怎么还会 panic?
实际上,这就是函数怎么也无法代替三目运算符语言特性的地方:作为语言特性的三目运算符可以做到惰性计算,而函数做不到。函数 IFTHEN 有3个参数,函数在压栈前必须对它的实参先进行计算并获得相应的值,也就是说,p == nil
和p.gender == 1
都会被求值。