网络编程
位置:首页>> 网络编程>> Go语言>> golang三元表达式的使用方法

golang三元表达式的使用方法

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

标签:golang,三元表达式

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

0
投稿

猜你喜欢

  • 1、我的第一个个人主页一打开就是一张很眩的图片,图片上有个“进入”,点击后才算真正看到我的主页。现在回想起来那个时候这样做,大概是很想迅速展
  • flash_url : "../swfupload/swfupload_f8.swf" upload_url: &quo
  • 您可以使用 ObjectContext 对象提交或放弃一项由 Microsoft Transaction Server (MTS) 管理的事
  • 阅读上一章:Chapter 9 精简标签Part 2: Simplebits Of Style  简短精悍的样式Chap
  • PDO::execPDO::exec — 执行一条 SQL 语句,并返回受影响的行数(PHP 5 >= 5.1.0, PECL pdo
  • 依次前移,实现聊友们的发言的更迭:function form1_onsubmit()if document.form1.
  • Q0.创建用户【前提】    你必须有CREATE USER系统权限。当你使用CREATE USER语句创建一
  • 新云4.0模版标签是全新改的了,加了前缀。如果你怀旧,请查看新云CMS3.1常用模板标签。下面的标签说明,后台就有,为了方便查看转到这里。{
  • 网页编程中,在与数据库打交道的时候我们经常会碰到乱码的经常。本文就将介绍一种ASP读取MySQL数据库出现乱码的解决办法。情景再现:使用My
  • 上周在去杭州betacafe的路上,有幸和绿人网梁宁和饭统网李耀东、千鸟一道,在出租车上聊起了地理和历史,其中有一个共同的观点是说,人们对事
  • 如果我需要在运行有SQL Server的机器上运行病毒扫描软件,怎样做才不会影响性能? 这取决于您希望运行的病毒扫描软件的类型。目前有三种类
  • 对大家推荐很好使用的MySql节点系统,像让大家对MySql节点系统有所了解,然后对MySql节点系统全面讲解介绍,希望对大家有用在向大家详
  • 什么是pyc文件pyc是一种二进制文件,是由py文件经过编译后,生成的文件,是一种byte code,py文件变成pyc文件后,加载的速度有
  • 本文实例讲述了asp.net C#实现解压缩文件的方法。一共给大家介绍了三段代码,一个是简单的解压缩单个zip文件,后一个可以解压批量的大量
  • 今年年初之时,微软发布了一个针对ActiveX控件的补丁,安装此补丁后的IE6中,当ActiveX控件获得焦点时,IE自动为其套上一个虚线矩
  • 一直希望自己对Web设计的色彩把握的更好些,所以手头上就备了一份图片版的配色表,对色彩的搭配有了很多的提高,今天发现了这套非常完整的Web版
  • MySQL使用于认证目的的用户名,与Unix用户名(登录名字)或Windows用户名无关。缺省地,大多数MySQL客户尝试使用当前Unix用
  • 小编最近由于工作原因要用到python,一门新的知识需要接触,对于我来说难度还是很大的。python工程目录结构每次创建一个python工程
  • 我们在做表单的时候经常会使用到这样的结构:<fieldset>     <lege
  • 昨时要导一些数据,从网上搜到的。字段多时insert 语句生成的不完整了,还没有找到原因..有个缺点……就是标识种子的列 也insert了c
手机版 网络编程 asp之家 www.aspxhome.com