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)
}
执行结果
来源:https://blog.csdn.net/daihepeng/article/details/107173496


猜你喜欢
- 本文实例讲述了JS学习笔记之数组去重实现方法。分享给大家供大家参考,具体如下:操作的数组 let arr=[0,1,23,'1
- 已经获取微信公众号发布的图片,但不能正常显示 ,提示:此图片来自微信公众平台 未经允许不得引用。 这是怎么回事呢?遇到这
- pyquery库是jQuery的Python实现,可以用于解析HTML网页内容,使用方法:from pyquery import PyQue
- 框架thinkphp 版本:3.2.3 内容:数据库操作1. 多表查找一条数据M('a表')->join("
- <script language="javascript"><!-- var&n
- 微信小程序图片上传,供大家参考,具体内容如下先来看一下微信小程序的api来看一下页面效果查看大图wxml文件代码:<view clas
- 本文实例讲述了微信小程序实现获取自己所处位置的经纬度坐标功能。分享给大家供大家参考,具体如下:1、效果展示2、关键代码index.wxml布
- 一、安装1.从官网下载Linux版的Pycharm官网链接:https://www.jetbrains.com/pycharm/downlo
- 基本映射映射使用在根据不同URLs请求来产生相对应的返回内容.Bottle使用route() 修饰器来实现映射.from bottle im
- 如下所示:class Login(QMainWindow): """登录窗口""
- Pyppeteer简介介绍Pyppeteer之前先说一下Puppeteer,Puppeteer是谷歌出品的一款基于Node.js开发的一款工
- 1.安装pymysql:pip install pymysql (在命令行窗口中执行)2.卸载pymysql:pip uninstall p
- 本文实例讲述了JS实现不规则TAB选项卡效果代码。分享给大家供大家参考。具体如下:这是一款不规则TAB选项卡效果,将中规中矩的方角换成了不规
- 该平台会集成UI自动化及api自动化,里面也会涉及到一些简单的HTML等前端,当然都是很基础的东西。在以后的博客里,我会一点点的尽量写详细,
- 本文实例为大家分享了Bootstrap导航栏和登陆框的具体代码,供大家参考,有不足的地方请大家谅解,大家共同学习进步。<!DOCTYP
- 如下所示:#!/usr/bin/env pythonimport serialimport timeimport threadclass M
- 一、排名开窗函数概述SQL Server的排名函数是对查询的结果进行排名和分组,TSQL共有4个排名函数,分别是:ROW_NUMBER、RA
- 前言订单并发这个问题我想大家都是有一定认识的,这里我说一下我的一些浅见,我会尽可能的让大家了解如何解决这类问题。在解释如何解决订单并发问题之
- hello,大家好,我是Dream。马上就跨年了,为了广大的单身男性成员,我就慈悲一下,把我的存货–表白神器拿出来了,百试百灵(虽然我一次也
- 一. 建库,建表,加约束. 1.1建库 use master go if exists (select * from sysdatabase