Golang 邪修: Golang 的三元表达式实现

2023-03-05 23:34:39 +08:00
 CC11001100

项目地址: 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:
	// 是

}

1746 次点击
所在节点    Go 编程语言
13 条回复
Ericcccccccc
2023-03-05 23:36:54 +08:00
(go 连 set 都没有
CC11001100
2023-03-05 23:42:27 +08:00
@Ericcccccccc 啊哈哈虽然一般都是用 map[T]struct{}{}实现 set ,不过我也造了一个各种 set 的轮子绑定了一堆 API ,下次用那个项目再水一发 :)
24bit
2023-03-05 23:43:37 +08:00
这种基础功能没必要单独搞个库吧 https://github.com/samber/lo/blob/master/condition.go
Trim21
2023-03-05 23:44:08 +08:00
CC11001100
2023-03-05 23:49:34 +08:00
@Trim21 @24bit 太经常用到不想拷来拷去就抽取了一个库,哇感谢大佬们原来 lo 已经有这个功能了,早知道去蹭个 pr 。。。
CC11001100
2023-03-05 23:52:18 +08:00
并没有造更好的轮子,自行点了下沉 1 天。。。
24bit
2023-03-05 23:53:48 +08:00
@CC11001100 这种常用的功能,以前没泛型搞着别扭没人搞,有泛型了常用的工具函数基本都有泛型实现了
Leviathann
2023-03-06 00:04:20 +08:00
三元和 if 都有子分支为 lazy 的语义
没有这个意识的人很容易写出有问题的代码
fregie
2023-03-06 00:34:43 +08:00
某些情况下,开发者所谓的简洁=软件工程的噩梦
lesismal
2023-03-06 02:07:01 +08:00
回复内容不能为空
CC11001100
2023-03-06 22:40:41 +08:00
@24bit 是的,没泛型的时候我就是每种类型都实现了一下。。。捂脸。。。
CC11001100
2023-03-06 22:44:00 +08:00
@Leviathann 是的,大佬牛皮,这个问题我们确实遇到过
ireina
2023-05-26 02:29:04 +08:00
虽然我也喜欢 if expression ,但是你的实现是错误的。if expression 最重要的就是短路特性或者惰性求值。你需要传入 closure 而不是具体的值。但是 golang 的语法会让这样写边的复杂,最终你会发现还不如 if statement 。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/921406

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX