golang 为什么不内建 map / reduce / filter / for_each / find / any 这样的函数/方法? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
lululau
V2EX    Go 编程语言

golang 为什么不内建 map / reduce / filter / for_each / find / any 这样的函数/方法?

div id="topic_720066_votes" class="votes">
  •  1
     
  •   lululau 2020-10-30 10:40:24 +08:00 6350 次点击
    这是一个创建于 1858 天前的主题,其中的信息可能已经有所发展或是发生改变。

    既然都支持函数 /方法作为“对象”了,好歹放到标准库里也行啊,为什么只能找第三方库?是什么设计思想导致了这个状况 ?

    36 条回复    2020-11-21 14:20:40 +08:00
    banishee
        1
    banishee  
       2020-10-30 10:45:13 +08:00
    golang 没有各种数据结构,有点小烦
    Mitt
        2
    Mitt  
       2020-10-30 10:45:37 +08:00   12
    因为没有泛型
    SuperMild
        3
    SuperMild  
       2020-10-30 10:55:19 +08:00
    二楼正解,没范型影响很大
    coderxy
        4
    coderxy  
       2020-10-30 11:00:08 +08:00
    你可以用 sort.Search
    xkeyideal
        5
    xkeyideal  
       2020-10-30 11:04:29 +08:00
    那三个老头定的基调,go 的设计思想就决定了不会搞这么多语法糖,提 issue 也没用,要么自己写,要么第三方,话说这玩意写起来也简单,官方不实现也挺好的,省的学了
    stevenbipt
        6
    stevenbipt  
       2020-10-30 11:16:03 +08:00
    没有范型,而且就算你说了官方也大概率不会听
    abcbuzhiming
    &bsp;   7
    abcbuzhiming  
       2020-10-30 11:49:03 +08:00   1
    Go 的设计者,最开始就是想搞个比 C 更好用的语言而已,你想想 C 是多么简单的语言。并且 Go 的设计者一开始压根就没想把 Go 开源出去,只想自己内部用用。并且主要目的是用来写“网络基础设施”

    但是后来没想到这个语言公开出来后火了,大量的人用来写 web 应用,应用层和基础设施侧重点就有区别,基础设施你没有泛型,无所谓,业务应用没有泛型就很别扭。所以 go 的泛型在社区不断的呼声中“不情不愿”的加上去的,至少有相当长的一段时间,Go 的官方是明确说过不加泛型这个话的。

    所以有些问题就属于娘胎来的毛病,Go 这个语言在原始设计的时候走的就是极简主义。
    dbskcnc
        8
    dbskcnc  
       2020-10-30 11:50:36 +08:00
    这个真的是范型的专长,包括 C++以前也是一样,有了范型,stl 就横空出世了
    还是期待 go 1.17 吧
    cheng6563
        9
    cheng6563  
       2020-10-30 12:03:14 +08:00
    go 只是 c 的升级版,不要把他当成多高层的语言
    ericgui
        10
    ericgui  
       2020-10-30 12:05:20 +08:00
    @dbskcnc 不是说泛型要 go2 才有吗
    lxml
        11
    lxml  
       2020-10-30 12:07:42 +08:00 via Android
    @ericgui go 2 不是指的版本号 2.0,只是一个计划
    lithbitren
        12
    lithbitren  
       2020-10-30 12:25:12 +08:00
    主要是没泛型,迭代器里面很直接难套函数
    gowk
        13
    gowk  
       2020-10-30 13:11:38 +08:00
    https://github.com/robpike/filter

    I wanted to see how hard it was to implement this sort of thing in Go, with as nice an API as I could manage. It wasn't hard.

    Having written it a couple of years ago, I haven't had occasion to use it once. Instead, I just use "for" loops.

    You shouldn't use it either.

    看了 Rob Pike 上面的话,我忍不住笑了,大神的意思是:
    “map / reduce / filter 这些玩意真的有那么好吗,好吧,我试着写一个库来实现这些东西,Go 实现起来就是小菜一碟。
    但是,我实现了又怎么了,这些代码一动不动的躺在这里好几年了,我他妈根本没有场合去使用它!我平时用用 for 就行了,我证明了这些东西没用,所以你们也不要用了。”

    可。。可是 Pike 大神,你平时写的都是 infrastructure,并不理解我们写业务写 CURD 的痛。。

    权当供大家一笑
    QBugHunter
        14
    QBugHunter  
       2020-10-30 13:29:53 +08:00
    @abcbuzhiming
    你想想 C 是多么简单的语言

    请问你这是反话嘛?
    icyalala
        15
    icyalala  
       2020-10-30 13:38:27 +08:00
    @QBugHunter C 确实比较简单,从语言的复杂性上来说。。
    azcvcza
        16
    azcvcza  
       2020-10-30 14:19:45 +08:00
    写习惯 C 的都是无脑写 for 的,刚开始写 js 我也不喜欢写 forEach,reduce, map, filter, find,some,
    chogath
        17
    chogath  
       2020-10-30 14:46:46 +08:00
    底层 go,业务层 rpc to node.js, 有啥好纠结的,就非得一把梭?
    index90
        18
    index90  
       2020-10-30 15:16:00 +08:00
    为什么总是拿 java 或其他语言的东西往 go 上套,那你又为了什么转 go,赶时髦吗?
    est
        19
    est  
       2020-10-30 15:25:47 +08:00 via Android
    go 是写给机器高效执行的,不是写给人看的。
    lululau
        20
    lululau  
    OP
       2020-10-30 15:29:08 +08:00
    @index90 好的特性为什么不能借鉴? Java 的 Stream API 也是 Java 8 才加入的。。。

    楼上有人都说了,未来 go 应该会加入对范型的支持,那离支持这种所谓“函数式编程”也不会太远,等着被打脸吧。。。

    不过我觉得就你这种心态,可能等不到被打脸,就在程序员这行干不下去了
    lululau
        21
    lululau  
    OP
       2020-10-30 15:30:47 +08:00
    @est 高效语言就不能有高级特性了吗,出门左转 Rust 了解一下,按你这说法所谓的“高效”场景,用汇编就好了
    Glauben
        22
    Glauben  
       2020-10-30 15:34:46 +08:00
    go 基本已经确定了明年会增加对泛型的支持啊,具体是 2 月还是 8 月不确定,实现方法看起来也还不错。
    FireFoxAhri
        23
    FireFoxAhri  
       2020-10-30 15:37:21 +08:00 via Android
    函数式的算子比写 for 方便多了,流式简短直观,scala 程序员试了下 go,这都没有确实有点不能接受
    Rwing
        24
    Rwing  
       2020-10-30 15:38:49 +08:00
    要说特性,C#最多,然而。。。。
    abcbuzhiming
        25
    abcbuzhiming  
       2020-10-30 15:38:57 +08:00   2
    @QBugHunter
    这怎么是反话? C 语言在语言层面上怎么不简单? C 语言之父专门描述过它当初设计 C 语言的想法,就专门提到它设计 C 语言的核心思想就来源 Unix,保持简单是核心思想。C 程序设计语言那本书才多厚? C 语言本身几乎没有任何花里胡哨的东西,纯过程语言,语法糖都没有,怎么不简单?

    C 语言在语言层面上是非常简单的,复杂的是围绕 C 语言的其它知识,尤其是计算机体系的基础。这导致你要用 C 语言写出可用的程序,不光是了解 C 语言的知识就行的。但是 C 语言本身特性,就是简单
    no1xsyzy
        26
    no1xsyzy  
       2020-10-30 15:42:40 +08:00
    @QBugHunter 是下层简单,不是用起来简单,worse is better 的那个 better
    est
        27
    est  
       2020-10-30 15:48:22 +08:00
    @lululau 想跟我抬杠,再练几年啊。我泛指所有高级语言了?你让我了解 Rust 我就了解?汇编就一定高效了?你谁啊你。
    Jirajine
        28
    Jirajine  
       2020-10-30 15:51:26 +08:00 via Android
    @icyalala
    C is simple, but hard to use.
    Rust is complex, but easy to use.
    simple2025
        29
    simple2025  
       2020-10-30 15:57:00 +08:00 via Android
    但是 golang 不只是用来写中间件,写 web 没有泛型?
    lxk11153
        30
    lxk11153  
       2020-10-30 16:57:45 +08:00
    可能过早优化是万恶之源吧 [doge]
    uxstone
        31
    uxstone  
       2020-10-30 17:30:24 +08:00
    @azcvcza 当用过一次 map 后,就会不再想用 for 了
    namelosw
        32
    namelosw  
       2020-10-30 18:56:48 +08:00 via iPhone
    说得好像第三方库也能写得出来标准的 map reduce 一样...
    pkwenda
        33
    pkwenda  
       2020-10-31 03:59:41 +08:00 via iPhone
    @QBugHunter 楼主的意思我理解了,但是我表达不出来,阿巴阿巴阿巴
    runze
        34
    runze  
       2020-10-31 09:00:35 +08:00
    @index90 #18
    “为什么总是拿 java 或其他语言的东西往 go 上套,那你又为了什么转 go,赶时髦吗?”
    这个“东西”过去是泛型,现在是便利的方法,以后还会是其他东西。
    azcvcza
        35
    azcvcza  
       2020-10-31 13:33:27 +08:00
    @uxstone 确实
    b00tyhunt3r
        36
    b00tyhunt3r  
       2020-11-21 14:20:40 +08:00 via iPhone
    @chogath 非杠 但如果要追求性能的话我为什么要用 go
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5697 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 30ms UTC 03:09 PVG 11:09 LAX 19:09 JFK 22:09
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86