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 · 334 天前 · 6080 次点击
    这是一个创建于 334 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近开始学 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  
       334 天前   ❤️ 1
    只有可比较的类型才能计算 min 和 max 有什么问题么? 没看出来喷点在哪。
    SingeeKing
        2
    SingeeKing  
       334 天前   ❤️ 4
    你学的知识有点旧🌚半年前的 Go 1.21 已经有了内置的 min max
    iseki
        3
    iseki  
       334 天前 via Android
    Go 的 comparable 其实是可做相等比较的意思…和比大小不沾边。
    faceair
        4
    faceair  
       334 天前
    comparable 只是表示可比较,不一定表示可以比较大小

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

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

    还在用大道至简这种不清不楚的表达
    mohuani
        30
    mohuani  
       333 天前
    @Binwalker 翻译:啥都没有
    gitrebase
        31
    gitrebase  
       333 天前
    @ufan0 我待过的每一个用 Go 的团队,都是新版本一出就升级的
    loolac
        32
    loolac  
       333 天前
    这是只能比较 a 和 b, 还有 cdef ... 呢
    xdeng
        33
    xdeng  
       333 天前
    什么时候把 三目运算 加上吧
    lambdaq
        34
    lambdaq  
       333 天前
    @taxue67marx 九转大肠 [/doge]
    RoccoShi
        35
    RoccoShi  
       333 天前
    每次刷 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  
       333 天前 via Android
    @nagisaushio 难绷,为啥啊
    zjbztianya
        37
    zjbztianya  
       333 天前
    现在力扣现在的 go 版本有泛型 min max 啊
    nagisaushio
        38
    nagisaushio  
       333 天前 via Android
    @Trim21 为了不增加运行时成本吧。如果实现成普通 variadic 函数每次都要构造一个 slice
    xoxo419
        39
    xoxo419  
       333 天前
    每种语言都好比一种武动, [太极拳只重其义,不重其招。你忘记所有的招式,就练成太极拳了。]
    securityCoding
        40
    securityCoding  
       333 天前
    go 的工具库,集合库凑合第三方吧,没见过这么搓的官方库
    jim9606
        41
    jim9606  
       333 天前
    知道你想吐槽老版 golang 不支持泛型了
    zoharSoul
        42
    zoharSoul  
       333 天前
    马上就加了
    Perry
        43
    Perry  
       333 天前 via iPhone
    当我们对一个工具了解的少的时候,总喜欢抱怨这个工具缺少什么,为什么不太好用,楼主就是很好的例子。
    Akiya
        44
    Akiya  
       333 天前   ❤️ 1
    @Perry 想必你也是反对 golang 加入泛型的吧,如果对 golang 不满意,一定是使用者的问题对吧
    LindsayZhou
        45
    LindsayZhou  
       333 天前
    @Akiya #44
    个人感觉没问题,用不适合的工具做事情本来就不是工具的问题。

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

    但这不能算是 golang 的问题,goroutine 带来的好处明显大过给这些边缘功能带来的坏处,我也觉得官方库不应该为了适配这种特殊场景增加额外的复杂度。明显就是我不应该用 golang 去做这个功能。
    capgrey
        46
    capgrey  
       333 天前
    钓鱼呢?
    现在 Leetcode Go verison 是 1.21, 已经有 min, max 了
    Akiya
        47
    Akiya  
       329 天前
    @LindsayZhou 但是像 min,max 这种,就是工具本身的问题,不然官方也不会在后续的版本加入泛型,最搞笑的是之前一堆 go 小子一堆理由分析 go 为啥不应该有泛型,需要泛型就不应该用 go
    Crazypointer
        48
    Crazypointer  
       300 天前
    我记得前段时间还用过 min 和 max ,leetcode 是支持的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5734 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 03:35 · PVG 11:35 · LAX 19:35 · JFK 22:35
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.