最近开始学 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 就不行
1
Reficul 2023-12-21 01:06:38 +08:00 1
只有可比较的类型才能计算 min 和 max 有什么问题么? 没看出来喷点在哪。
|
2
SingeeKing 2023-12-21 01:12:23 +08:00 4
你学的知识有点旧🌚半年前的 Go 1.21 已经有了内置的 min max
|
3
iseki 2023-12-21 01:24:41 +08:00 via Android
Go 的 comparable 其实是可做相等比较的意思…和比大小不沾边。
|
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 |
5
zhs227 2023-12-21 08:14:34 +08:00
go.1.21 开始已经有了。
|
6
bazingaterry 2023-12-21 08:40:42 +08:00
go 不适合刷 leetcode
|
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 ``` |
8
Binwalker 2023-12-21 09:01:23 +08:00
大道至简啊
|
9
taxue67marx 2023-12-21 09:17:34 +08:00 5
学习新的编程语言时,一定要保持开放的思维,每种编程语言的设计理念和实现方式都有其独特的地方
|
10
xingjue 2023-12-21 09:20:31 +08:00
你学的知识有点旧🌚半年前的 Go 1.21 已经有了内置的 min max
|
11
zydxn 2023-12-21 09:25:01 +08:00
楼上说了 Go 1.21 已经有了,而且补充一点,leetcode 也支持了 1.21 ,并不用自己每次写一个 func min 或者 max
|
12
Mirage09 2023-12-21 09:26:19 +08:00
go 确实不适合用来刷 leetcode
|
13
ufan0 2023-12-21 09:27:17 +08:00
借楼问下,使用 Go 做商业开发的朋友们,
会像 Java 一样,多年保持 1.8 甚至 1.7 吗? |
15
lizhisty 2023-12-21 09:32:52 +08:00
别学了,自己写个语言
|
16
s1mpleOf 2023-12-21 09:34:05 +08:00
所以 math 庫是幹嘛的呢?:)
|
17
echo1937 2023-12-21 09:35:02 +08:00
看来应该学习/使用 1.21+
|
18
drvDPqg5nO7kZWhv 2023-12-21 09:36:03 +08:00
剽悍的语言不需要解释,我们只需要 == 和 !=,别问为什么,因为再多就不是简洁
|
19
ixiaohei 2023-12-21 09:39:03 +08:00 1
@ufan0 之前项目都是使用有维护支持的版本,经常在紧跟倒数第二个版本; golang 只会维护当前两个版本;后面 golang1.18 加了范型;停在 1.17 很久之后又开始跟了最新的版本了(可能是范型加的东西太多,当时主导升级的人没学会,不会用;另外 golang 支持范型的版本运行效率有些下降;当时不想因为用不上范型反而要去忍受性下降,所以没升)
|
20
Trim21 2023-12-21 09:42:24 +08:00 via Android
没泛型的时候 max min 需要魔法,有了泛型才
能有不需要编辑器开后门的 max min 。 |
21
fregie 2023-12-21 09:55:01 +08:00 via Android
我甚至不知道该从什么角度吐槽了
|
22
ZeroDu 2023-12-21 10:51:39 +08:00
这就是 go ,大道至简。写着写着总会遇到一些蛋疼的问题
|
23
bronya0 2023-12-21 11:39:59 +08:00
用 go 就是这样,你别把它当 python ,当成增强的 c 就能理解了,很操蛋
|
24
crackidz 2023-12-21 11:52:41 +08:00
@ixiaohei 要考虑所有的工具链是不是适合升级,这个确实卡了很久,我们很多的在用工具链在大概过了 1 年多才适配最新的版本
|
25
7inFen 2023-12-21 11:56:43 +08:00
|
26
Mexion 2023-12-21 12:00:35 +08:00 via Android
Go 本来就啥都没有,体验非常蛋疼
|
27
totoro52 2023-12-21 12:03:21 +08:00
go 自带库功能很少, 还是 java 的生态香啊
|
28
nagisaushio 2023-12-21 12:32:03 +08:00 1
@Trim21 然而新版本内置的 min max 还是编译器开后门(悲)
|
29
Hanggi 2023-12-21 12:43:07 +08:00
都过去这么多年了,对 golang 的认知并没有什么提升呢。
还在用大道至简这种不清不楚的表达 |
32
loolac 2023-12-21 13:30:52 +08:00
这是只能比较 a 和 b, 还有 cdef ... 呢
|
33
xdeng 2023-12-21 13:53:58 +08:00
什么时候把 三目运算 加上吧
|
34
lambdaq 2023-12-21 14:31:58 +08:00
@taxue67marx 九转大肠 [/doge]
|
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 } ``` |
36
Trim21 2023-12-21 18:29:18 +08:00 via Android
@nagisaushio 难绷,为啥啊
|
37
zjbztianya 2023-12-21 19:31:47 +08:00
现在力扣现在的 go 版本有泛型 min max 啊
|
38
nagisaushio 2023-12-21 19:44:21 +08:00 via Android
@Trim21 为了不增加运行时成本吧。如果实现成普通 variadic 函数每次都要构造一个 slice
|
39
xoxo419 2023-12-21 21:18:48 +08:00
每种语言都好比一种武动, [太极拳只重其义,不重其招。你忘记所有的招式,就练成太极拳了。]
|
40
securityCoding 2023-12-21 21:22:53 +08:00
go 的工具库,集合库凑合第三方吧,没见过这么搓的官方库
|
41
jim9606 2023-12-21 21:29:16 +08:00
知道你想吐槽老版 golang 不支持泛型了
|
42
zoharSoul 2023-12-21 22:15:07 +08:00
马上就加了
|
43
Perry 2023-12-21 22:23:20 +08:00 via iPhone
当我们对一个工具了解的少的时候,总喜欢抱怨这个工具缺少什么,为什么不太好用,楼主就是很好的例子。
|
45
LindsayZhou 2023-12-22 09:20:28 +08:00
@Akiya #44
个人感觉没问题,用不适合的工具做事情本来就不是工具的问题。 我这边最近写的一个东西要同时处理多个网络命名空间。 比较好的处理方式是起不同的线程,同时放在不同的命名空间里。 但是 golang 不行,因为 goroutine 的操作,不能让用户控制线程。只能锁住不让 golang 切换线程,修改当前线程所在的命名空间,这样会带来严重的性能问题。 但这不能算是 golang 的问题,goroutine 带来的好处明显大过给这些边缘功能带来的坏处,我也觉得官方库不应该为了适配这种特殊场景增加额外的复杂度。明显就是我不应该用 golang 去做这个功能。 |
46
capgrey 2023-12-22 10:37:04 +08:00
钓鱼呢?
现在 Leetcode Go verison 是 1.21, 已经有 min, max 了 |
47
Akiya 2023-12-25 12:11:19 +08:00
@LindsayZhou 但是像 min,max 这种,就是工具本身的问题,不然官方也不会在后续的版本加入泛型,最搞笑的是之前一堆 go 小子一堆理由分析 go 为啥不应该有泛型,需要泛型就不应该用 go
|
48
Crazypointer 336 天前
我记得前段时间还用过 min 和 max ,leetcode 是支持的
|