Golang Go语言中:Golang 的三元表达式实现

发布于 1周前 作者 vueper 来自 Go语言

项目地址: https://github.com/golang-infrastructure/go-if-expression

Golang 的三元表达式实现

一、开发初衷

Golang 中缺少三元表达式,就导致某些情况三元表达式一行就能搞定的事情到 Golang 里面就得写得很啰嗦, 这是无法忍受的,这个库就是借助大量自定义的 if 函数来实现类似三元表达式的功能,最新版本是基于泛型实现的。

使用此库之前:

if a % 2 == 0 {
    return "偶数"
} else {
    return "奇数"
}

使用此库之后:

return if_expression.Return(a % 2 == 0, "偶数", "奇数")

对比:

- if a % 2 == 0 {
- 	return "偶数"
- } else {
- 	return "奇数"
- }
+ return if_expression.Return(a % 2 == 0, "偶数", "奇数")

二、引入依赖

go get 安装:

go get -u github.com/golang-infrastructure/go-if-expression

如果你不想增加新的依赖,直接拷贝下面这段代码到你的 utils 中,泛型的实现版本非常简洁:

package if_expression

// Return // // @Description: if 实现的三元表达式 // @param boolExpression: 布尔表达式,最终返回一个布尔值 // @param trueReturnValue: 当 boolExpression 返回值为 true 的时候返回的值 // @param falseReturnValue: 当 boolExpression 返回值为 false 的时候返回的值 // @return bool: 三元表达式的结果,为 trueReturnValue 或者 falseReturnValue 中的一个 func Return[T any](boolExpression bool, trueReturnValue, falseReturnValue T) T { if boolExpression { return trueReturnValue } else { return falseReturnValue } }

三、Example

比如最常见的默认值场景:

threadNum := 0
fmt.Printf("线程数: %d", if_expression.Return(threadNum == 0, 1, threadNum))

使用的例子:

package main

import ( “fmt” if_expression “github.com/golang-infrastructure/go-if-expression” )

func main() {

r := if_expression.Return(true, "是", "否")
fmt.Println(r)
// Output:
// 是

}


Golang Go语言中:Golang 的三元表达式实现

更多关于Golang Go语言中:Golang 的三元表达式实现的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

14 回复

(go 连 set 都没有

更多关于Golang Go语言中:Golang 的三元表达式实现的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


啊哈哈虽然一般都是用 map[T]struct{}{}实现 set ,不过我也造了一个各种 set 的轮子绑定了一堆 API ,下次用那个项目再水一发 :)

太经常用到不想拷来拷去就抽取了一个库,哇感谢大佬们原来 lo 已经有这个功能了,早知道去蹭个 pr 。。。

并没有造更好的轮子,自行点了下沉 1 天。。。

这种常用的功能,以前没泛型搞着别扭没人搞,有泛型了常用的工具函数基本都有泛型实现了

三元和 if 都有子分支为 lazy 的语义
没有这个意识的人很容易写出有问题的代码

某些情况下,开发者所谓的简洁=软件工程的噩梦

回复内容不能为空

是的,没泛型的时候我就是每种类型都实现了一下。。。捂脸。。。

是的,大佬牛皮,这个问题我们确实遇到过

虽然我也喜欢 if expression ,但是你的实现是错误的。if expression 最重要的就是短路特性或者惰性求值。你需要传入 closure 而不是具体的值。但是 golang 的语法会让这样写边的复杂,最终你会发现还不如 if statement 。

在Go语言中,虽然不像某些其他编程语言(如C、C++、Python等)直接支持三元表达式(即条件运算符 ?:),但我们可以通过其他简洁的方式来实现类似的功能。

Go语言推荐的做法是使用if-else语句来实现三元表达式的逻辑。这里有一个简单的示例来说明如何在Go中实现类似三元表达式的功能:

package main

import (
	"fmt"
)

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

func main() {
	result := ternaryLike(true, 5, 10) // 如果条件为true,返回5;否则返回10
	fmt.Println(result)               // 输出: 5

	result = ternaryLike(false, 5, 10) // 如果条件为false,返回10;否则返回5
	fmt.Println(result)               // 输出: 10
}

上述代码中,ternaryLike函数根据传入的布尔条件condition返回两个整数ab中的一个。这种方式虽然比直接的三元表达式稍微冗长一些,但它是Go语言惯用的方式,且保持了代码的清晰和可读性。

在Go编程中,简洁和清晰通常是首要考虑的因素,因此使用if-else语句来实现条件逻辑是符合Go语言设计哲学的。

回到顶部