Go 是否有三元运算符?Rust 和 Python 是怎么做的?

这篇具有很好参考价值的文章主要介绍了Go 是否有三元运算符?Rust 和 Python 是怎么做的?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Go 是否有三元运算符?Rust 和 Python 是怎么做的?,golang,rust,python

嗨,大家好!本文是系列文章 Go 技巧第十四篇,系列文章查看:Go 语言技巧。

今天来聊聊在 Go 语言中是否支持三元运算符。这个问题很简单,没有。

首先,什么是三元运算符?

在其他一些编程语言中,如 C 语言,三元运算符是一种可以用一行代码实现条件选择的简便方法。

x = condition ? a : b; // condition = true 则 x = a,否则 x = b

大道至简的 Go 中肯定是没有这个运算符。

今天这篇文章将会就此展开,介绍 Go 中三元运算符的一些实践。

让我们正式开始吧。

使用 if-else 语句

三元运算符,本质上其实就是 if-else 的简化版本。通过 if-else 实现自然就是最常用的做法。

var x int
if condition {
    x = a
} else {
    x = b
}

非常简单且易理解,无心智负担。毕竟,这就应该是它本来的样子。

虽然这比三元运算符要长一些,但它更容易理解,也是 Go 所推荐的方式。

一行表达式

三元运算符之所以被人喜爱,我觉得重要的一个原因就是:它足够简洁。我们只要一行代码就实现条件判断。

在 Go 中,如果想在一行代码实现,可能吗?

我们先来看看 rust 和 Python 是如何实现的。

Go 是否有三元运算符?Rust 和 Python 是怎么做的?,golang,rust,python

如果了解 rust,你可能看过如下代码。

let x = {
  if condition {
    a
  } else {
    b
  }
};

如上的代码中,我们创建了一个代码块,它的最后一个表达式会作为 x 的值。这是 rust 所支持的语法。其实现代的不少语言支持这种简约语法。

或者更简洁下写法也可以,如下:

let = if condition {a} else {b}

如果你了解 Python,你可能看到这样的代码。

x = a if condition else b

是不是更加简洁。

Go 不支持这样的语法,我们要实现类似效果,就只能通过立刻执行的匿名函数实现。

代码如下:

x := func() int {
  if condition {
     return a
  }
  return b
}()

算了,好丑,太麻烦了!

看起来还是 if-else 好用。但我还是不甘心,还是希望实现一行代码的效果,怎么办呢?

If 函数

前面的示例中,我们通过匿名函数实现类似于三元运算符的功能。那不是说,我们预实现一个函数即可?

让我们写一个 If 的函数来模拟三元运算符。这个函数接收一个布尔值和两个可能的返回值。根据布尔值的真假,它返回其中一个值。

代码如下所示:

func If(condition bool, a, b int) int {
    if condition {
        return a
    }
    return b
}

x := If(3 > 2, x1, x2)

现在的代码是不是就清晰了许多呢?

但这种方法还是有个缺点,就是针对不同的类型都要实现一个 If 函数,如 IfInt()IfString()IfFloat() 等等。

不过从 Go 1.18 开始,Go 成功引入泛型。

Go 是否有三元运算符?Rust 和 Python 是怎么做的?,golang,rust,python

我们可以通过泛型扩展一个更通用的 If 函数,不仅仅适用于整数,还可以用于其他类型。

示例代码如下:

func If[T any](condition bool, a, b T) T {
    if condition {
        return a
    }
    return b
}

func main() {
    x := 10
    result := If(x > 0, "positive", "negative")
    fmt.Println(result) // 输出 "positive"
}

当然,我也不是建议这么用。既然官方不支持就算了吧,if-else 多写几行就多写几行吧。

奇淫巧技:基于 map

在网上,我还发现了一个奇淫巧技:基于 Map 模拟三元运算法。

代码如下:

x = map[string]int{
  true: b,
  false: c,
}[a]

基于 truefalse 实现条件判断。

这方法看起来挺有创意,但这其实会增加代码的理解成本,降低可读性。再者,这种方法的效率是没有 if-else 的效率高的,因为涉及到了 map 的算法实现,没有那么直接。

为什么 Go 没有三元运算符

你是否好奇,为什么 Go 语言没有三元运算符?

Go 是否有三元运算符?Rust 和 Python 是怎么做的?,golang,rust,python

官方认为三元运算符有时会让代码变得复杂和难以理解。Go 鼓励写出更清晰直接的代码。

一个 C 语言版本的复杂三元运算符示例代码:

#include <stdio.h>

int main() {
    int x = 5, y = 10, z = 15;
    char *result;

    result = x > y ? "X" : 
             y > z ? "Y" : 
             z > x ? "Z" : 
             x == y ? "X equals Y" : 
             y == z ? "Y equals Z" : 
             x == z ? "X equals Z" : 
             "All equal";

    printf("%s\n", result);
    return 0;
}

看这个代码,头晕没?

我们看看摘自官方文档的原文:

The reason ?: is absent from Go is that the language’s designers had seen the operation used too often to create impenetrably complex expressions. The if-else form, although longer, is unquestionably clearer. A language needs only one conditional control flow construct.

翻译内容:

Go 语言中没有 ?: 运算符的原因是,该语言的设计者们观察到这种运算符过于频繁地被用来创建难以理解的复杂表达式。尽管 if-else 形式更长,但它无疑更清晰。一种语言只需要一种条件控制流构造。

从 rust 和 python 的决策上也可看出,这个观点得到了很多人的认同。但与 Go 不同的是,rust 和 python 虽然不支持传统的三元运算符,它们都提供了其他简洁的写法。

不禁思考:Go 强调大道至简。但 rust 和 python 其实也挺简单的,依旧保留了三运算法符的优点。

总结

本文主要就 Go 中三元运算符展开讨论,从简单 if-else 语句、到基于匿名函数的单行表达式、及泛型抽象 If 函数等方式来实现类似的功能。当然,我没有建议使用这些方式,在没有内置支持的情况下,if-else 的写法就挺好的。

博文地址:Go 中如何实现三元运算符?Rust 和 Python 是怎么做的?文章来源地址https://www.toymoban.com/news/detail-831159.html

到了这里,关于Go 是否有三元运算符?Rust 和 Python 是怎么做的?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • JAVA的三元运算符

    例题:   在项目中创建类 Calculation 在主方法中创建 3 个整数记录男生人数、女生人数和总人数 使用逻辑运算符来判断“男生人数大于女生人数并且总人数大于 30 人”和“男生人数大于女生人数或者总人数大于 30 人”这两种情况是否存在 1.三元运算符 使用格式   条件式 ?

    2024年02月06日
    浏览(43)
  • 微信小程序使用三元运算符

    针对wxml中的style的三元运算符 针对wxml中的src的三元运算符 针对wxml中的获取后台数据值的三元运算符 完整代码块 CSS样式

    2024年02月08日
    浏览(46)
  • PHP两个三元运算符“??” 和“?:”的用法和区别

    在PHP 7中,有两个类似的语法结构:“??”和“?:”,它们都是用于处理条件判断和返回值的运算符。尽管它们看起来相似,但它们的作用和用法有一些区别。 \\\"?:\\\"是三目运算符,语法格式为:$result = $test ? t e s t : ′ ′ ; 意思就是当 test:\\\'\\\';意思就是当 t es t : ′′ ; 意思就是当

    2024年03月17日
    浏览(47)
  • FPGA四选一的多路选择器(用三元运算符?:解决)

           ?:符号通常用于条件运算符,表示条件判断。它类似于C语言中的三元运算符,用于根据条件选择不同的操作或值。         例如,在Verilog中,条件运算符?:可以用于if-else语句的简写形式。它的一般语法格式如下:         如果表达式为真,则结果为结果1;否

    2024年01月21日
    浏览(50)
  • 探索JavaScript中强大的三元运算符:简洁、灵活、提升代码效率

    三元运算是一种在编程中常见的条件表达式。它使用三个操作数进行条件判断,并返回两个值中的一个,具体取决于条件的真假。 三元运算符的优势:相比于使用传统的 if-else 语句,三元运算符可以简化代码并提高代码的可读性。它可以使条件判断和返回结果在一行内完成,

    2024年01月16日
    浏览(62)
  • 7.JS里表达式,if条件判断,三元运算符,switch语句,断点调试

    表达式就是可以被求值的代码比如什么a = 1 语句就是一段可以执行的代码比如什么if else 直接给B站的黑马程序员的老师引流一波总结的真好 就是基本上所有的语言都会有的if else 语句就是满足不同的条件执行不同的代码,让计算机有条件判断的能力。 注意在if的括号里面除了

    2024年02月20日
    浏览(52)
  • Rust ?运算符 Rust读写txt文件

    一、Rust ?运算符 ?运算符:传播错误的一种快捷方式。 如果Result是Ok:Ok中的值就是表达式的结果,然后继续执行程序。 如果Result是Err:Err就是整个函数的返回值,就像使用了return ?运算符只能用于返回Result的函数。 ?运算符与main函数 main函数返回类型是:() main函数的

    2024年02月22日
    浏览(36)
  • Rust 重载运算符|复数结构的“加减乘除”四则运算

    复数定义 由实数部分和虚数部分所组成的数,形如a+bi 。 其中a、b为实数,i 为“虚数单位”,i² = -1,即虚数单位的平方等于-1。 a、b分别叫做复数a+bi的实部和虚部。 当b=0时,a+bi=a 为实数; 当b≠0时,a+bi 又称虚数; 当b≠0、a=0时,bi 称为纯虚数。 实数和虚数都是复

    2024年02月13日
    浏览(55)
  • Rust 中的 Option、Result 和 ? 运算符

    在编程中,我们经常会遇到某个值或者某个数据域可能存在,可能不存在;如果存在,它才会包含某个值。在C/C++ 中,一般会使用 NULL 表示不存在这种情况,而 NULL 是很多异常和安全的祸根。Rust 从语言层面就删除了对 NULL 的支持,并在标准库中引入 Option 类型,用于表示上述

    2024年01月23日
    浏览(44)
  • Go 运算符

    运算符用于对变量和值执行操作。 加号运算符(+)将两个值相加,如下面的示例所示: 示例代码: 尽管加号运算符通常用于将两个值相加,但它也可以用于将变量和值相加,或者将一个变量和另一个变量相加。 示例代码: 算术运算符用于执行常见的数学操作。 + :加法,

    2024年02月10日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包