gpt4 book ai didi

golang三元表达式的使用方法

转载 作者:qq735679552 更新时间:2022-09-27 22:32:09 25 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章golang三元表达式的使用方法由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

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

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

?
1
2
3
4
5
if expr {
  n = trueVal
} else {
  n = falseVal
}

不过用 if 的问题是变量 n 有作用域问题. 我们需要在 if 之前先定义变量 n,这样才可以在 if 语句之后使用变量 n.

?
1
2
3
4
5
6
7
var n int
if expr {
  n = trueVal
} else {
  n = falseVal
}
println(n)

本来一个简单的 n := expr? trueVal: falseVal 就能够表达的问题,变的复杂了很多。 这和Go所追求的简单思路是有冲突的.

类似的有 max/min 等函数。因为这类函数使用频度比较高,在很多pkg的内部都定义了私有的实现.

?
1
2
3
4
5
6
func max(a, b int) int {
  if a < b {
  return b
  }
  return a
}

熟悉Go语言的用户应该可以发现,这个 max 只支持 int 类型。 对于支持泛型的C++语言来说,max 一般被实现为一个模板函数:

?
1
2
3
4
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 关键字):

?
1
2
3
4
5
6
7
8
9
10
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 。 因为三元表达式是一个表达式,必然是允许嵌套的.

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

示例

  。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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三元表达式的使用方法

到此这篇关于golang三元表达式的使用方法的文章就介绍到这了,更多相关golang三元表达式内容请搜索我以前的文章或继续浏览下面的相关文章希望大家以后多多支持我! 。

原文链接:https://blog.csdn.net/daihepeng/article/details/107173496 。

最后此篇关于golang三元表达式的使用方法的文章就讲到这里了,如果你想了解更多关于golang三元表达式的使用方法的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com