Go 是否有三元运算符?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 是如何实现的。

如果了解 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 成功引入泛型。

请添加图片描述

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

示例代码如下:

func If[T any](condition bool, a, b T) T {if condition {return a}return b
}func main() {x := 10result := 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 鼓励写出更清晰直接的代码。

一个 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 是怎么做的?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/691220.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL篇之分库分表

一、为什么要分库分表 1.目的 1. 分担了访问压力 2. 解决存储压力 2.分库分表的时机 1. 前提&#xff0c;项目业务数据逐渐增多&#xff0c;或业务发展迅速&#xff0c;单表的数据量达1000W或20G以后。 2. 优化已解决不了性能问题&#xff08;主从读写分离、查询索引…&am…

数据库管理-第152期 Oracle Vector DB AI-04(20240220)

数据库管理152期 2024-02-20 数据库管理-第152期 Oracle Vector DB & AI-04&#xff08;20240220&#xff09;1 常用的向量检索方法聚类图搜索哈希量化 2 Oracle Vector DB中的索引索引&#xff08;默认&#xff09; 索引&#xff08;高级&#xff09;3 EMBEDDINGSSQL EMBE…

阿里云备案服务器买哪种?多少钱?有什么限制条件?

在阿里云备案服务器需要多少钱&#xff1f;目前符合备案条件的阿里云服务器只要30元&#xff0c;并且这台云服务器可以备案5个网站。2核4G配置&#xff0c;价格为30元3个月&#xff0c;也可以选择2核2G轻量服务器&#xff0c;61元一年&#xff0c;阿里云老用户还可以选择99元一…

通俗易懂地理解稀疏性

今天我想与大家探讨的是一个数学和工程学中的重要概念——稀疏性。这个概念可能听起来很抽象&#xff0c;但它实际上贯穿于我们生活中的许多方面。那么&#xff0c;稀疏性到底是什么呢&#xff1f;简单来说&#xff0c;在数学和信号处理领域&#xff0c;一个信号被称为稀疏&…

Eclipse - Text Editors (文本编辑器)

Eclipse - Text Editors [文本编辑器] References Window -> Preferences -> General -> Editors -> Text Editors Displayed tab witdth: 4 勾选 Insert spaces for tabs 勾选 Show line number References [1] Yongqiang Cheng, https://yongqiang.blog.csdn.n…

力扣(LeetCode)数据结构练习题(2)

今天又写了两道关于链表的练习题&#xff0c;来给大家分享一下。巩固一下上一篇学到的链表知识&#xff0c;题目可以然我们更清楚的认识链表。 目录 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表 给你单链表的头结点 head &#xff0c;请…

小红书数据分析:sora爆火,为内容行业带来哪些变化

导语 春节还没过完&#xff0c;科技圈就出“大事”了~据悉&#xff0c;OpenAI发布了Sora&#xff0c;一种由文字生成视频的AI工具&#xff0c;且效果极其逼真&#xff0c;打破了多项纪录。Sora的出现&#xff0c;又让人类里通用人工智能AGI近了一步。那么。Sora的出现对于小红…

外贸人做外贸听话要听音

有人说&#xff0c;在做外贸的时候大部分的人都是充当着客服的角色&#xff0c;而且遵循的模式也是一问一答&#xff0c;凡是客户提出的问题&#xff0c;我们都会尽可能详细的回答。 但是对于如何提问客户&#xff0c;却是不知道怎么下手&#xff0c; 于是&#xff0c;在这样的…

hive load data未正确读取到日期

1.源数据CSV文件日期字段值&#xff1a; 2.hive DDL语句&#xff1a; CREATE EXTERNAL TABLE test.textfile_table1(id int COMMENT ????, name string COMMENT ??, gender string COMMENT ??, birthday date COMMENT ????,.......) ROW FORMAT SERDE org.apache.…

wordpress企业网站模板免费

绿色风格的wordpress免费模板&#xff0c;经测试可以免费下载的WP模板。 https://www.wpniu.com/themes/300.html 简洁大气的文化艺术类wordpress模板&#xff0c;可以免费下载&#xff0c;实用易上手&#xff0c;新手也适合。 https://www.wpniu.com/themes/304.html 高端大…

C++面试宝典第30题:分发饼干

题目 假设你是一位非常棒的家长,想要给你的孩子们分发一些小饼干。但是,每个孩子最多只能给一块饼干。对每一个孩子i,都有一个胃口值gi,这是能让孩子们满足胃口的饼干的最小尺寸。对每一块饼干j,都有一个尺寸sj。如果sj >= gi,我们就可以将这个饼干j分配给孩子i,这个…

golangci-lint如何关闭typecheck

https://github.com/golangci/golangci-lint/issues/2912 typecheck是go源码的校验&#xff0c;无法通过.golangci.yml配置关闭 可以直接在golangci-lint源码层面关闭typecheck

Springboot AOP开发

Springboot AOP开发 一 AOP概述 AOP&#xff0c;即面向切面编程&#xff0c;简言之&#xff0c;面向方法编程。 针对方法&#xff0c;在方法的执行前或执行后使用&#xff0c;用于增强方法&#xff0c;或拓展。 二 AOP开发 1.引入 spring-boot-starter-aop 在SpringBoot项…

【高效开发工具系列】PyCharm使用

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

自养号测评低成本高效率推广,安全可控

测评的作用在于让用户更真实、清晰、快捷地了解产品以及产品的使用方法和体验。通过买家对产品的测评&#xff0c;也可以帮助厂商和卖家优化产品缺陷&#xff0c;提高用户的使用体验。这进而帮助他们获得更好的销量&#xff0c;并更深入地了解市场需求。因此&#xff0c;测评在…

.NET高级面试指南专题九【 泛型概念,常用泛型类和方法,泛型约束,协变与逆变】

C#中的泛型&#xff08;Generics&#xff09;是一种强大的编程特性&#xff0c;它允许你在编写代码时使用不特定数据类型&#xff0c;而在编译时确定这些数据类型。泛型使得代码更加灵活、可重用&#xff0c;并提高了类型安全性。 功能和原理 泛型允许你编写能够与不同数据类型…

数字孪生核心技术揭秘(五):BIM究竟是解药还是毒药?

一、关于BIM的那些幻想 1.1 BIM是“数字孪生城市”最后一块拼图&#xff1f; 近几年&#xff0c;CIM概念越来越流行&#xff0c;已经成为数字孪生城市的主流数据模型。CIM原始概念指的是“城市信息模型”&#xff1b;2015年同济大学吴志强院士基于CIM概念提出“城市智慧模型”&…

如何用ChatGPT绘图?

详情点查看公众号&#xff1a;技术科研吧 链接&#xff1a;如何用ChatGPT绘图&#xff1f; 一&#xff1a;AI领域最新技术 1.OpenAI新模型-GPT-5 2.谷歌新模型-Gemini Ultra 3.Meta新模型-LLama3 4.科大讯飞-星火认知 5.百度-文心一言 6.MoonshotAI-Kimi 7.智谱AI-GLM-…

ChatGPT在数据分析学习阶段的应用

ChatGPT在数据分析学习阶段的应用 ​ 这个阶段&#xff0c;核心是三件事&#xff1a;制定学习计划、确定学习资料以及学习策略。我们可以自己完成这几件事&#xff0c;当然也可以借助ChatGPT来高效地达到目的。 1.1 制定学习计划 ​ 学习阶段的第一件事是制定学习计划&#…

Unity3d Mesh篇(一)— 创建简单三角面

文章目录 前言一、Mesh组成二、使用步骤三、效果四、总结 前言 Mesh&#xff08;网格&#xff09;是一种常用的3D图形表示方法&#xff0c;它由顶点&#xff0c;法线&#xff0c;UV 坐标&#xff0c;和三角形等组成。您可以使用 Mesh 类的方法来创建或修改网格&#xff0c;也可…