V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
CC11001100
V2EX  ›  Go 编程语言

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

  •  
  •   CC11001100 ·
    CC11001100 · 2023-03-05 23:34:39 +08:00 · 1741 次点击
    这是一个创建于 660 天前的主题,其中的信息可能已经有所发展或是发生改变。

    项目地址: 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:
    	// 是
    
    }
    
    
    13 条回复    2023-05-26 02:29:04 +08:00
    Ericcccccccc
        1
    Ericcccccccc  
       2023-03-05 23:36:54 +08:00
    (go 连 set 都没有
    CC11001100
        2
    CC11001100  
    OP
       2023-03-05 23:42:27 +08:00
    @Ericcccccccc 啊哈哈虽然一般都是用 map[T]struct{}{}实现 set ,不过我也造了一个各种 set 的轮子绑定了一堆 API ,下次用那个项目再水一发 :)
    24bit
        3
    24bit  
       2023-03-05 23:43:37 +08:00
    这种基础功能没必要单独搞个库吧 https://github.com/samber/lo/blob/master/condition.go
    Trim21
        4
    Trim21  
       2023-03-05 23:44:08 +08:00
    CC11001100
        5
    CC11001100  
    OP
       2023-03-05 23:49:34 +08:00
    @Trim21 @24bit 太经常用到不想拷来拷去就抽取了一个库,哇感谢大佬们原来 lo 已经有这个功能了,早知道去蹭个 pr 。。。
    CC11001100
        6
    CC11001100  
    OP
       2023-03-05 23:52:18 +08:00
    并没有造更好的轮子,自行点了下沉 1 天。。。
    24bit
        7
    24bit  
       2023-03-05 23:53:48 +08:00
    @CC11001100 这种常用的功能,以前没泛型搞着别扭没人搞,有泛型了常用的工具函数基本都有泛型实现了
    Leviathann
        8
    Leviathann  
       2023-03-06 00:04:20 +08:00   ❤️ 2
    三元和 if 都有子分支为 lazy 的语义
    没有这个意识的人很容易写出有问题的代码
    fregie
        9
    fregie  
       2023-03-06 00:34:43 +08:00 via Android
    某些情况下,开发者所谓的简洁=软件工程的噩梦
    lesismal
        10
    lesismal  
       2023-03-06 02:07:01 +08:00
    回复内容不能为空
    CC11001100
        11
    CC11001100  
    OP
       2023-03-06 22:40:41 +08:00
    @24bit 是的,没泛型的时候我就是每种类型都实现了一下。。。捂脸。。。
    CC11001100
        12
    CC11001100  
    OP
       2023-03-06 22:44:00 +08:00
    @Leviathann 是的,大佬牛皮,这个问题我们确实遇到过
    ireina
        13
    ireina  
       2023-05-26 02:29:04 +08:00   ❤️ 1
    虽然我也喜欢 if expression ,但是你的实现是错误的。if expression 最重要的就是短路特性或者惰性求值。你需要传入 closure 而不是具体的值。但是 golang 的语法会让这样写边的复杂,最终你会发现还不如 if statement 。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5953 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 02:05 · PVG 10:05 · LAX 18:05 · JFK 21:05
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.