golang如何实现三元运算符功能

 更新时间:2024年02月06日 08:52:47   作者:波罗学  
这篇文章主要介绍了在其他一些编程语言中,如 C 语言,三元运算符是一种可以用一行代码实现条件选择的简便方法,那么在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 := 10
    result := If(x > 0, "positive", "negative")
    fmt.Println(result) // 输出 "positive"
}

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

奇淫巧技:基于 map

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

代码如下:

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

基于 true 和 false 实现条件判断。

这方法看起来挺有创意,但这其实会增加代码的理解成本,降低可读性。再者,这种方法的效率是没有 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 语句或立即执行的匿名函数等方式来实现类似的功能。

除此以外,可以根据你的需要和你觉得哪种方法更容易理解来选择使用。

以上就是golang如何实现三元运算符功能的详细内容,更多关于go三元运算符的资料请关注脚本之家其它相关文章!

相关文章

  • Go Gin 处理跨域问题解决

    Go Gin 处理跨域问题解决

    在前后端分离的项目中,经常会遇到跨域问题,本文主要介绍了Go Gin 处理跨域问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-05-05
  • Go语言使用Gob传输数据

    Go语言使用Gob传输数据

    本文主要介绍了Go语言使用Gob传输数据,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • Golang使用gorm实现分页功能的示例代码

    Golang使用gorm实现分页功能的示例代码

    在提供列表接口时一般要用到分页,对于存储在某些数据库中的数据进行分页起来非常的方便,下文给出一个通过gorm进行分页并通过http返回数据的例子,感兴趣的小伙帮跟着小编一起来看看吧
    2024-10-10
  • golang中使用mongo的方法介绍

    golang中使用mongo的方法介绍

    这篇文章主要给大家介绍了关于golang中使用mongo的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-08-08
  • win10下go mod配置方式

    win10下go mod配置方式

    这篇文章主要介绍了win10下go mod配置方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • go语言Pflag Viper Cobra 核心功能使用介绍

    go语言Pflag Viper Cobra 核心功能使用介绍

    这篇文章主要为大家介绍了go语言Pflag Viper Cobra 核心功能使用介绍,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09
  • golang网络通信超时设置方式

    golang网络通信超时设置方式

    这篇文章主要介绍了golang网络通信超时设置方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • golang整合日志zap的实现示例

    golang整合日志zap的实现示例

    Go语言中的zap库提供了强大的日志管理功能,支持日志记录到文件、日志切割、多日志级别、结构化日志输出等,它通过三种方法zap.NewProduction()、zap.NewDevelopment()和zap.NewExample(),快速构建适用于不同环境的logger,感兴趣的可以了解一下
    2024-10-10
  • golang 定时任务方面time.Sleep和time.Tick的优劣对比分析

    golang 定时任务方面time.Sleep和time.Tick的优劣对比分析

    这篇文章主要介绍了golang 定时任务方面time.Sleep和time.Tick的优劣对比分析,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-05-05
  • golang 实现一个负载均衡案例(随机,轮训)

    golang 实现一个负载均衡案例(随机,轮训)

    这篇文章主要介绍了golang 实现一个负载均衡案例(随机、轮训),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04

最新评论