三元表达式的介绍在这里:
Go语言明确不支持三元表达式,这里是相关的讨论: https://groups.google.com/d/msg/golang- nuts/dbyqx_LGUxM/tLFFSXSfOdQJ
官方FAQ的说明在这里: http://golang.org/doc/faq#Does_Go_have_a_ternary_form
官方FAQ推荐的做法是用 if 代替:
if
if expr { n = trueVal } else { n = falseVal }
不过用 if 的问题是变量 n 有作用域问题. 我们需要在 if 之前先定义变量 n,这样才可以在 if 语句之后使用变量 n。
n
var n int if expr { n = trueVal } else { n = falseVal } println(n)
本来一个简单的 n := expr? trueVal: falseVal 就能够表达的问题,变的复杂了很多。 这和Go所追求的简单思路是有冲突的。
n := expr? trueVal: falseVal
类似的有 max/min 等函数。因为这类函数使用频度比较高,在很多pkg的内部都定义了私有的实现。
max
min
func max(a, b int) int { if a < b { return b } return a }
熟悉Go语言的用户应该可以发现,这个 max 只支持 int 类型。 对于支持泛型的C++语言来说,max 一般被实现为一个模板函数:
int
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语言中,虽然没有泛型和运算符重载,但是三元表达式也具备全部的特性(因为表达式天生就是支持泛型的)。
T
a<b
而这些都是Go语言中缺少的特性。 不过在Go语言中可以模拟一个更普通的函数(If 的首字母大写,是函数名,不是 if 关键字):
If
func If(condition bool, trueVal, falseVal interface{}) interface{} { if condition { return trueVal } return falseVal } a, b := 2, 3 max := If(a > b, a, b).(int) println(max)
有几个关键点:
bool
interface{}
.(type)
由此可见,?: 不仅仅是一个简单的三元表达式。其实它更像一个内置的泛型版的函数(因为表达式天生就是支持泛型的)。
?:
期望未来的Go版本中,能完善对 ?: 三元表达式 和 编译时的泛型 的支持。
补充: 星星 同学的提示:可能会导致深入嵌套的滥用: c?d?e?0:1:2:3 。 因为三元表达式是一个表达式,必然是允许嵌套的。
c?d?e?0:1:2:3
不过我觉得嵌套不是问题的本质,函数也能导致嵌套的滥用。 但是不能因为滥用的行为来排斥有存在价值的语法(比如三元表达式)。
Go语言的三元表达式介绍到这里,更多Go学习请参考编程字典Go教程 和问答部分,谢谢大家对编程字典的支持。
原文链接:https://blog.csdn.net/Aria_Miazzy/article/details/102491626?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522163480011616780274138504%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=163480011616780274138504&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_v2~rank_v29-15-102491626.pc_v2_rank_blog_default&utm_term=go&spm=1018.2226.3001.4450