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

Go 竟然没有标准库的 min max

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

    最近开始学 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  
       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
    学习新的编程语言时,一定要保持开放的思维,每种编程语言的设计理念和实现方式都有其独特的地方
    xingjue
        10
    xingjue  
       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
    Mirage09
        12
    Mirage09  
       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
    Mexion
        26
    Mexion  
       2023-12-21 12:00:35 +08:00 via Android
    Go 本来就啥都没有,体验非常蛋疼
    totoro52
        27
    totoro52  
       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  
       363 天前
    @LindsayZhou 但是像 min,max 这种,就是工具本身的问题,不然官方也不会在后续的版本加入泛型,最搞笑的是之前一堆 go 小子一堆理由分析 go 为啥不应该有泛型,需要泛型就不应该用 go
    Crazypointer
        48
    Crazypointer  
       333 天前
    我记得前段时间还用过 min 和 max ,leetcode 是支持的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2783 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 12:02 · PVG 20:02 · LAX 04:02 · JFK 07:02
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.