Go 竟然没有标准库的 min max

308 天前
 chesha1

最近开始学 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 就不行

6039 次点击
所在节点    Go 编程语言
48 条回复
jim9606
307 天前
知道你想吐槽老版 golang 不支持泛型了
zoharSoul
307 天前
马上就加了
Perry
307 天前
当我们对一个工具了解的少的时候,总喜欢抱怨这个工具缺少什么,为什么不太好用,楼主就是很好的例子。
Akiya
306 天前
@Perry 想必你也是反对 golang 加入泛型的吧,如果对 golang 不满意,一定是使用者的问题对吧
LindsayZhou
306 天前
@Akiya #44
个人感觉没问题,用不适合的工具做事情本来就不是工具的问题。

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

但这不能算是 golang 的问题,goroutine 带来的好处明显大过给这些边缘功能带来的坏处,我也觉得官方库不应该为了适配这种特殊场景增加额外的复杂度。明显就是我不应该用 golang 去做这个功能。
capgrey
306 天前
钓鱼呢?
现在 Leetcode Go verison 是 1.21, 已经有 min, max 了
Akiya
303 天前
@LindsayZhou 但是像 min,max 这种,就是工具本身的问题,不然官方也不会在后续的版本加入泛型,最搞笑的是之前一堆 go 小子一堆理由分析 go 为啥不应该有泛型,需要泛型就不应该用 go
Crazypointer
273 天前
我记得前段时间还用过 min 和 max ,leetcode 是支持的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1002121

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX