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 这样的函数/方法?

  •  1
     
  •   lululau · 2020-10-30 10:40:24 +08:00 · 5930 次点击
    这是一个创建于 1478 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    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
        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.
    chenqh
        29
    chenqh  
       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   ·   实用小工具   ·   2818 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 05:47 · PVG 13:47 · LAX 21:47 · JFK 00:47
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.