golang三元表达式的使用方法

作者:daihepeng 时间:2023-08-28 14:34:09 

golang并没有像C语言一样提供三元表达式。三元表达式的好处是可以用一行代码解决原本需要多行代码才能完成的功能,让冗长的代码瞬间变得简洁。不过对于新手来说,建议还是少用三元表达式。在这里,我用golang通过函数的方式实现了三元表达式。

官方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 <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, 3
max := If(a > b, a, b).(int)
println(max)

有几个关键点:

  • Go不支持运算符重载,因此需要先将 a<b 在函数外转换为 bool 条件

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

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

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

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

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

补充: 星星 同学的提示:可能会导致深入嵌套的滥用: c?d?e?0:1:2:3 。 因为三元表达式是一个表达式,必然是允许嵌套的。

不过我觉得嵌套不是问题的本质,函数也能导致嵌套的滥用。 但是不能因为滥用的行为来排斥有存在价值的语法(比如三元表达式)。

示例


package magic
/*
实现三元表达式的功能
*/
func If(condition bool, trueVal, falseVal interface{}) interface{} {
if condition {
return trueVal
} else {
return falseVal
}
}
package magic
/*
单元测试案例
*/
import (
"testing"
)

func TestIf(t *testing.T) {
var a, b int = 2, 3
res := If(a > b, a, b)
if res == a {
t.Error("三元表达式计算错误")
}
t.Log(res)
}

执行结果

golang三元表达式的使用方法

来源:https://blog.csdn.net/daihepeng/article/details/107173496

标签:golang,三元表达式
0
投稿

猜你喜欢

  • vue指令之表单控件绑定v-model v-model与v-bind结合使用

    2023-07-02 16:28:15
  • windows下安装python paramiko模块的代码

    2021-05-11 03:11:23
  • Python统计文本词汇出现次数的实例代码

    2022-01-11 02:13:14
  • CKeditor富文本编辑器使用技巧之添加自定义插件的方法

    2024-04-18 09:52:24
  • python目标检测yolo2详解及预测代码复现

    2021-09-30 12:35:20
  • Java连接数据库oracle中文乱码解决方案

    2024-01-19 02:48:10
  • Python纯代码通过神经网络实现线性回归的拟合方式

    2022-07-12 23:54:59
  • Python使用pickle模块存储数据报错解决示例代码

    2023-12-10 02:05:05
  • Golang中的sync.WaitGroup用法实例

    2023-08-31 03:57:28
  • 使用html+js+css 实现页面轮播图效果(实例讲解)

    2024-02-24 01:48:44
  • mysql delete 多表连接删除功能

    2024-01-21 15:02:41
  • Python ADF 单位根检验 如何查看结果的实现

    2021-05-24 13:40:39
  • js动态创建上传表单通过iframe模拟Ajax实现无刷新

    2024-05-22 10:40:32
  • PID原理与python的简单实现和调参

    2021-08-13 13:27:36
  • Python 中如何写注释

    2022-07-10 21:53:11
  • python实现日常记账本小程序

    2023-09-06 18:00:49
  • Python3 filecmp模块测试比较文件原理解析

    2021-10-28 15:24:19
  • python+OpenCV实现图像拼接

    2023-01-28 08:09:26
  • 使用Python编写Linux系统守护进程实例

    2022-06-09 16:50:52
  • Python第三方常用模块openpyxl的简单介绍

    2021-05-28 16:10:09
  • asp之家 网络编程 m.aspxhome.com