Go 竟然没有标准库的 min max - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
FlashEcho
V2EX    Go 编程语言

Go 竟然没有标准库的 min max

  •  
  •   FlashEcho 2023-12-21 00:59:27 +08:00 6536 次点击
    这是一个创建于 660 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近开始学 go ,就用 go 刷 leetcode ,竟然没有 min max 函数,真的非常蛋疼
    连标准库功能一点都不丰富的 C++都有内置的 min 和 max 呢

    虽然 go 现在也有泛型了,但是直接用泛型写一个 min max 也是不行的
    没有直接支持 > <
    比如下面这个就是不合法的

    func max[T comparable](a, b T) T { if a > b { return a } return b } 

    还得再引入一个包

    import ( "golang.org/x/exp/constraints" ) func max[T constraints.Ordered](a, b T) T { if a > b { return a } return b } 

    所以这么设计的意义在哪里,很怪很怪,还有什么流行的语言没有内置 min 和 max 吗?
    C 也没有 max 和 min ,但是人家好歹可以用宏一行写一个,go 就不行

    48 条回复    2024-01-24 11:06:44 +08:00
    Reficul
        1
    Reficul  
       2023-12-21 01:06:38 +08:00   1
    只有可比较的类型才能计算 min 和 max 有什么问题么? 没看出来喷点在哪。
    SingeeKing
        2
    SingeeKing  
    PRO
       2023-12-21 01:12:23 +08:00   4
    你学的知识有点旧半年前的 Go 1.21 已经有了内置的 min max
    iseki
        3
    iseki  
       2023-12-21 01:24:41 +08:00 via Android
    Go 的 comparable 其实是可做相等比较的意思…和比大小不沾边。
    faceair
        4
    faceair  
       2023-12-21 01:34:14 +08:00
    comparable 只是表示可比较,不一定表示可以比较大小

    func equal[T comparable](a, b T) bool {
    return a != b
    }

    1.21 里的内置函数 min max 引用的是 cmp.Ordered 标准库的泛型约束,不用引用 exp
    zhs227
        5
    zhs227  
       2023-12-21 08:14:34 +08:00
    go.1.21 开始已经有了。
    bazingaterry
        6
    bazingaterry  
    2023-12-21 08:40:42 +08:00
    go 不适合刷 leetcode
    horsley
        7
    horsley  
       2023-12-21 08:58:09 +08:00
    一点小提示,你在 leetcode 用 go ,直接用 min max ,上下文里面有
    函数签名大抵是
    ```
    func max(a, b int) int
    func min(a, b int) int
    ```
    Binwalker
        8
    Binwalker  
       2023-12-21 09:01:23 +08:00
    大道至简啊
    taxue67marx
        9
    taxue67marx  
       2023-12-21 09:17:34 +08:00   5
    学习新的编程语言时,一定要保持开放的思维,每种编程语言的设计理念和实现方式都有其独特的地方
    nxcdJaNnmyF9O90X
        10
    nxcdJaNnmyF9O90X  
       2023-12-21 09:20:31 +08:00
    你学的知识有点旧半年前的 Go 1.21 已经有了内置的 min max
    zydxn
        11
    zydxn  
       2023-12-21 09:25:01 +08:00
    楼上说了 Go 1.21 已经有了,而且补充一点,leetcode 也支持了 1.21 ,并不用自己每次写一个 func min 或者 max
    NVDA
        12
    NVDA  
       2023-12-21 09:26:19 +08:00
    go 确实不适合用来刷 leetcode
    ufan0
        13
    ufan0  
       2023-12-21 09:27:17 +08:00
    借楼问下,使用 Go 做商业开发的朋友们,
    会像 Java 一样,多年保持 1.8 甚至 1.7 吗?
    lizhisty
        14
    lizhisty  
       2023-12-21 09:32:18 +08:00   2
    @ufan0 不可能的都是新版本的往前一个版本
    lizhisty
        15
    lizhisty  
       2023-12-21 09:32:52 +08:00
    别学了,自己写个语言
    s1mpleOf
        16
    s1mpleOf  
       2023-12-21 09:34:05 +08:00
    所以 math 是嘛的呢?:)
    echo1937
        17
    echo1937  
       2023-12-21 09:35:02 +08:00
    看来应该学习/使用 1.21+
    drvDPqg5nO7kZWhv
        18
    drvDPqg5nO7kZWhv  
       2023-12-21 09:36:03 +08:00
    剽悍的语言不需要解释,我们只需要 == 和 !=,别问为什么,因为再多就不是简洁
    ixiaohei
        19
    ixiaohei  
       2023-12-21 09:39:03 +08:00   1
    @ufan0 之前项目都是使用有维护支持的版本,经常在紧跟倒数第二个版本; golang 只会维护当前两个版本;后面 golang1.18 加了范型;停在 1.17 很久之后又开始跟了最新的版本了(可能是范型加的东西太多,当时主导升级的人没学会,不会用;另外 golang 支持范型的版本运行效率有些下降;当时不想因为用不上范型反而要去忍受性下降,所以没升)
    Trim21
        20
    Trim21  
       2023-12-21 09:42:24 +08:00 via Android
    没泛型的时候 max min 需要魔法,有了泛型才
    能有不需要编辑器开后门的 max min 。
    fregie
        21
    fregie  
       2023-12-21 09:55:01 +08:00 via Android
    我甚至不知道该从什么角度吐槽了
    ZeroDu
        22
    ZeroDu  
       2023-12-21 10:51:39 +08:00
    这就是 go ,大道至简。写着写着总会遇到一些蛋疼的问题
    bronya0
        23
    bronya0  
       2023-12-21 11:39:59 +08:00
    用 go 就是这样,你别把它当 python ,当成增强的 c 就能理解了,很操蛋
    crackidz
        24
    crackidz  
       2023-12-21 11:52:41 +08:00
    @ixiaohei 要考虑所有的工具链是不是适合升级,这个确实卡了很久,我们很多的在用工具链在大概过了 1 年多才适配最新的版本
    7inFen
        25
    7inFen  
       2023-12-21 11:56:43 +08:00
    Wanex
        26
    Wanex  
       2023-12-21 12:00:35 +08:00 via Android
    Go 本来就啥都没有,体验非常蛋疼
    MIUIOS
        27
    MIUIOS  
       2023-12-21 12:03:21 +08:00
    go 自带库功能很少, 还是 java 的生态香啊
    nagisaushio
        28
    nagisaushio  
       2023-12-21 12:32:03 +08:00   1
    @Trim21 然而新版本内置的 min max 还是编译器开后门(悲)
    Hanggi
        29
    Hanggi  
       2023-12-21 12:43:07 +08:00
    都过去这么多年了,对 golang 的认知并没有什么提升呢。

    还在用大道至简这种不清不楚的表达
    mohuani
        30
    mohuani  
       2023-12-21 13:14:38 +08:00
    @Binwalker 翻译:啥都没有
    gitrebase
        31
    gitrebase  
       2023-12-21 13:16:32 +08:00
    @ufan0 我待过的每一个用 Go 的团队,都是新版本一出就升级的
    loolac
        32
    loolac  
       2023-12-21 13:30:52 +08:00
    这是只能比较 a 和 b, 还有 cdef ... 呢
    xdeng
        33
    xdeng  
       2023-12-21 13:53:58 +08:00
    什么时候把 三目运算 加上吧
    lambdaq
        34
    lambdaq  
       2023-12-21 14:31:58 +08:00
    @taxue67marx 九转大肠 [/doge]
    RoccoShi
        35
    RoccoShi  
       2023-12-21 14:47:43 +08:00
    每次刷 leetcode 的时候都会吐槽 go 居然没有开箱即用的 min, max, abs, hashtable

    ```
    func min(a, b int) int { if b < a { return b }; return a }
    func max(a, b int) int { if b > a { return b }; return a }
    func abs(x int) int { if x < 0 { return -x }; return x }
    ```
    Trim21
        36
    Trim21  
       2023-12-21 18:29:18 +08:00 via Android
    @nagisaushio 难绷,为啥啊
    zjbztianya
        37
    zjbztianya  
       2023-12-21 19:31:47 +08:00
    现在力扣现在的 go 版本有泛型 min max 啊
    nagisaushio
        38
    nagisaushio  
       2023-12-21 19:44:21 +08:00 via Android
    @Trim21 为了不增加运行时成本吧。如果实现成普通 variadic 函数每次都要构造一个 slice
    xoxo419
        39
    xoxo419  
       2023-12-21 21:18:48 +08:00
    每种语言都好比一种武动, [太极拳只重其义,不重其招。你忘记所有的招式,就练成太极拳了。]
    securityCoding
        40
    securityCoding  
       2023-12-21 21:22:53 +08:00
    go 的工具库,集合库凑合第三方吧,没见过这么搓的官方库
    jim9606
        41
    jim9606  
       2023-12-21 21:29:16 +08:00
    知道你想吐槽老版 golang 不支持泛型了
    zoharSoul
        42
    zoharSoul  
       2023-12-21 22:15:07 +08:00
    马上就加了
    Perry
        43
    Perry  
       2023-12-21 22:23:20 +08:00 via iPhone
    当我们对一个工具了解的少的时候,总喜欢抱怨这个工具缺少什么,为什么不太好用,楼主就是很好的例子。
    Akiya
        44
    Akiya  
       2023-12-22 08:58:25 +08:00   1
    @Perry 想必你也是反对 golang 加入泛型的吧,如果对 golang 不满意,一定是使用者的问题对吧
    LindsayZhou
        45
    LindsayZhou  
       2023-12-22 09:20:28 +08:00
    @Akiya #44
    个人感觉没问题,用不适合的工具做事情本来就不是工具的问题。

    我这边最近写的一个东西要同时处理多个网络命名空间。
    比较好的处理方式是起不同的线程,同时放在不同的命名空间里。
    但是 golang 不行,因为 goroutine 的操作,不能让用户控制线程。只能锁住不让 golang 切换线程,修改当前线程所在的命名空间,这样会带来严重的性能问题。

    但这不能算是 golang 的问题,goroutine 带来的好处明显大过给这些边缘功能带来的坏处,我也觉得官方库不应该为了适配这种特殊场景增加额外的复杂度。明显就是我不应该用 golang 去做这个功能。
    capgrey
        46
    capgrey  
       2023-12-22 10:37:04 +08:00
    钓鱼呢?
    现在 Leetcode Go verison 是 1.21, 已经有 min, max 了
    Akiya
        47
    Akiya  
       2023-12-25 12:11:19 +08:00
    @LindsayZhou 但是像 min,max 这种,就是工具本身的问题,不然官方也不会在后续的版本加入泛型,最搞笑的是之前一堆 go 小子一堆理由分析 go 为啥不应该有泛型,需要泛型就不应该用 go
    Crazypointer
        48
    Crazypointer  
       2024-01-24 11:06:44 +08:00
    我记得前段时间还用过 min 和 max ,leetcode 是支持的
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     885 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 29ms UTC 20:41 PVG 04:41 LAX 13:41 JFK 16:41
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86