博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
mysql三元表达式_Go语言的三元表达式
阅读量:6621 次
发布时间:2019-06-25

本文共 1195 字,大约阅读时间需要 3 分钟。

三元表达式的介绍在这里:

官方FAQ推荐的做法是用 if 代替:

if expr {

n = trueVal

} else {

n = falseVal

}

不过用 if 的问题是变量 n 有作用域问题.

我们需要在 if 之前先定义变量 n,这样才可以在 if 语句之后使用变量 n。

var n int

if 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

const T& max (const T& a, const T& b) {

return (a

}

在C++版本中,不仅用到的泛型T,还依赖 a

在C语言中,虽然没有泛型和运算符重载,但是三元表达式也具备全部的特性(因为表达式天生就是支持泛型的)。

而这些都是Go语言中缺少的特性。

不过在Go语言中可以模拟一个更普通的函数(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)

有几个关键点:

Go不支持运算符重载,因此需要先将 a

Go不支持泛型,只能用 interface{} 模拟

返回的类型安全需要用户自己保证,.(type) 的类型必须匹配

interface{} 是运行时泛型,性能没有编译时泛型高

由此可见,?: 不仅仅是一个简单的三元表达式。其实它更像一个内置的泛型版的函数(因为表达式天生就是支持泛型的)。

期望未来的Go版本中,能完善对 ?: 三元表达式 和 编译时的泛型 的支持。

补充:

星星 同学的提示:可能会导致深入嵌套的滥用: c?d?e?0:1:2:3 。

因为三元表达式是一个表达式,必然是允许嵌套的。

不过我觉得嵌套不是问题的本质,函数也能导致嵌套的滥用。

但是不能因为滥用的行为来排斥有存在价值的语法(比如三元表达式)。

有疑问加站长微信联系(非本文作者)

5c5fbae790ec0313d6ee17e8b3dd9ba1.png

转载地址:http://uycpo.baihongyu.com/

你可能感兴趣的文章
Angular学习笔记(一) - 之安装教程
查看>>
Spring Websocket实现文本、图片、声音、文件下载及推送、接收及显示(集群模式)...
查看>>
Python学习
查看>>
ADHD的应对技术:大脑的Hack和升级
查看>>
阿里云文件存储NAS简介及应用场景
查看>>
“数据结构+算法”视角的Asprova
查看>>
最严新规发布 网络短视频平台该如何降低违规风险? ...
查看>>
云服务器ECS出现速度变慢 以及突然断开怎么办?
查看>>
208亿背后的“秘密”
查看>>
Android系统自带样式(android:theme)解析
查看>>
全志A33开发板Linux内核定时器编程
查看>>
全栈必备 敏捷估点
查看>>
一个爬虫小技巧
查看>>
作为一名合格的JAVA架构师需要点亮哪些技能树?
查看>>
为什么短视频会让人刷不停?背后也许用了这套技术
查看>>
Kubernetes 在知乎上的应用
查看>>
读C#开发实战1200例子记录-2017年8月14日11:20:38获取汉字编码值
查看>>
Fescar 发布 0.3.1 版本, 支持 ZooKeeper 注册中心
查看>>
网站优化中四个常见的优化难题及解决方法!
查看>>
【死磕 Spring】----- IOC 之解析 bean 标签:BeanDefinition
查看>>