V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
lululau

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

  •  1
     
  •   lululau · Oct 30, 2020 · 6571 views
    This topic created in 2006 days ago, the information mentioned may be changed or developed.

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

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

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

    所以有些问题就属于娘胎来的毛病,Go 这个语言在原始设计的时候走的就是极简主义。
    dbskcnc
        8
    dbskcnc  
       Oct 30, 2020
    这个真的是范型的专长,包括 C++以前也是一样,有了范型,stl 就横空出世了
    还是期待 go 1.17 吧
    cheng6563
        9
    cheng6563  
       Oct 30, 2020
    go 只是 c 的升级版,不要把他当成多高层的语言
    ericgui
        10
    ericgui  
       Oct 30, 2020
    @dbskcnc 不是说泛型要 go2 才有吗
    lxml
        11
    lxml  
       Oct 30, 2020 via Android
    @ericgui go 2 不是指的版本号 2.0,只是一个计划
    lithbitren
        12
    lithbitren  
       Oct 30, 2020
    主要是没泛型,迭代器里面很直接难套函数
    gowk
        13
    gowk  
       Oct 30, 2020
    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  
       Oct 30, 2020
    @abcbuzhiming
    你想想 C 是多么简单的语言

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

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

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

    C 语言在语言层面上是非常简单的,复杂的是围绕 C 语言的其它知识,尤其是计算机体系的基础。这导致你要用 C 语言写出可用的程序,不光是了解 C 语言的知识就行的。但是 C 语言本身特性,就是简单
    no1xsyzy
        26
    no1xsyzy  
       Oct 30, 2020
    @QBugHunter 是下层简单,不是用起来简单,worse is better 的那个 better
    est
        27
    est  
       Oct 30, 2020
    @lululau 想跟我抬杠,再练几年啊。我泛指所有高级语言了?你让我了解 Rust 我就了解?汇编就一定高效了?你谁啊你。
    Jirajine
        28
    Jirajine  
       Oct 30, 2020 via Android
    @icyalala
    C is simple, but hard to use.
    Rust is complex, but easy to use.
    simple2025
        29
    simple2025  
       Oct 30, 2020 via Android
    但是 golang 不只是用来写中间件,写 web 没有泛型?
    lxk11153
        30
    lxk11153  
       Oct 30, 2020
    可能过早优化是万恶之源吧 [doge]
    uxstone
        31
    uxstone  
       Oct 30, 2020
    @azcvcza 当用过一次 map 后,就会不再想用 for 了
    namelosw
        32
    namelosw  
       Oct 30, 2020 via iPhone
    说得好像第三方库也能写得出来标准的 map reduce 一样...
    pkwenda
        33
    pkwenda  
       Oct 31, 2020 via iPhone
    @QBugHunter 楼主的意思我理解了,但是我表达不出来,阿巴阿巴阿巴
    runze
        34
    runze  
       Oct 31, 2020
    @index90 #18
    “为什么总是拿 java 或其他语言的东西往 go 上套,那你又为了什么转 go,赶时髦吗?”
    这个“东西”过去是泛型,现在是便利的方法,以后还会是其他东西。
    azcvcza
        35
    azcvcza  
       Oct 31, 2020
    @uxstone 确实
    b00tyhunt3r
        36
    b00tyhunt3r  
       Nov 21, 2020 via iPhone
    @chogath 非杠 但如果要追求性能的话我为什么要用 go😂
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2678 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 95ms · UTC 15:58 · PVG 23:58 · LAX 08:58 · JFK 11:58
    ♥ Do have faith in what you're doing.