最近开始学 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 ![]() 只有可比较的类型才能计算 min 和 max 有什么问题么? 没看出来喷点在哪。 |
![]() | 2 SingeeKing PRO ![]() 你学的知识有点旧半年前的 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 ![]() 学习新的编程语言时,一定要保持开放的思维,每种编程语言的设计理念和实现方式都有其独特的地方 |
![]() | 10 nxcdJaNnmyF9O90X 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 NVDA 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 ![]() @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 Wanex 2023-12-21 12:00:35 +08:00 via Android Go 本来就啥都没有,体验非常蛋疼 |
![]() | 27 MIUIOS 2023-12-21 12:03:21 +08:00 go 自带库功能很少, 还是 java 的生态香啊 |
![]() | 28 nagisaushio 2023-12-21 12:32:03 +08:00 ![]() @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 2024-01-24 11:06:44 +08:00 我记得前段时间还用过 min 和 max ,leetcode 是支持的 |