
项目地址: https://github.com/golang-infrastructure/go-if-expression
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 } } 比如最常见的默认值场景:
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: // 是 } 1 Ericcccccccc 2023-03-05 23:36:54 +08:00 (go 连 set 都没有 |
2 CC11001100 OP @Ericcccccccc 啊哈哈虽然一般都是用 map[T]struct{}{}实现 set ,不过我也造了一个各种 set 的轮子绑定了一堆 API ,下次用那个项目再水一发 :) |
3 24bit 2023-03-05 23:43:37 +08:00 这种基础功能没必要单独搞个库吧 https://github.com/samber/lo/blob/master/condition.go |
4 Trim21 2023-03-05 23:44:08 +08:00 |
5 CC11001100 OP |
6 CC11001100 OP 并没有造更好的轮子,自行点了下沉 1 天。。。 |
7 24bit 2023-03-05 23:53:48 +08:00 @CC11001100 这种常用的功能,以前没泛型搞着别扭没人搞,有泛型了常用的工具函数基本都有泛型实现了 |
8 Leviathann 2023-03-06 00:04:20 +08:00 三元和 if 都有子分支为 lazy 的语义 没有这个意识的人很容易写出有问题的代码 |
9 fregie 2023-03-06 00:34:43 +08:00 via Android 某些情况下,开发者所谓的简洁=软件工程的噩梦 |
10 lesismal 2023-03-06 02:07:01 +08:00 回复内容不能为空 |
11 CC11001100 OP @24bit 是的,没泛型的时候我就是每种类型都实现了一下。。。捂脸。。。 |
12 CC11001100 OP @Leviathann 是的,大佬牛皮,这个问题我们确实遇到过 |
13 ireina 2023-05-26 02:29:04 +08:00 虽然我也喜欢 if expression ,但是你的实现是错误的。if expression 最重要的就是短路特性或者惰性求值。你需要传入 closure 而不是具体的值。但是 golang 的语法会让这样写边的复杂,最终你会发现还不如 if statement 。 |