The Go Programming Language
› http://golang.org/
› Go Playground
Go Projects
› Revel Web Framework
FlashEcho

Go 竟然没有标准库的 min max

  •  
  •   FlashEcho · Dec 21, 2023 · 7606 views
    This topic created in 1055 days ago, the information mentioned may be changed or developed.

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

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

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

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

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

    但这不能算是 golang 的问题,goroutine 带来的好处明显大过给这些边缘功能带来的坏处,我也觉得官方库不应该为了适配这种特殊场景增加额外的复杂度。明显就是我不应该用 golang 去做这个功能。
    capgrey
    capgrey
    Dec 22, 2023
    46
    钓鱼呢?
    现在 Leetcode Go verison 是 1.21, 已经有 min, max 了
    Akiya
    Akiya
    Dec 25, 2023
    47
    @LindsayZhou 但是像 min,max 这种,就是工具本身的问题,不然官方也不会在后续的版本加入泛型,最搞笑的是之前一堆 go 小子一堆理由分析 go 为啥不应该有泛型,需要泛型就不应该用 go
    Crazypointer
    Crazypointer
    Jan 24, 2024
    48
    我记得前段时间还用过 min 和 max ,leetcode 是支持的
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   2882 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 96ms · UTC 05:29 · PVG 13:29 · LAX 21:29 · JFK 00:29
    ♥ Do have faith in what you're doing.