V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
partystart
V2EX  ›  程序员

go 没有 lambda 表达式。。很蛋疼啊

  •  
  •   partystart · 2021-12-08 19:09:31 +08:00 · 5198 次点击
    这是一个创建于 1083 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近在做需求

    需要根据 shop ids 获取到对应的 额外信息

    再根据 shop ids 获取对应的 item 信息

    发现没有 lambda 表达式

    居然还的一个个去封装。。

    就很蛋疼啊。。

    27 条回复    2021-12-09 15:15:22 +08:00
    iBugOne
        1
    iBugOne  
       2021-12-08 19:14:17 +08:00 via Android
    为什么需要 lambda 表达式呢?既然 func(){} 可以直接当表达式用(就像 JS function(){} 一样),直接用 func 不也挺好的?

    DoSomething(func(x int) int { return x+1 })
    Akiya
        2
    Akiya  
       2021-12-08 19:14:50 +08:00   ❤️ 11
    何止是没有 lambda...
    如何从 slice 里面移除一个元素:只需要找到这个元素的 index ,然后再把前后拼接成一个 slice 就可以了
    如何从两个 int 取一个最大值呢:math.Max 只支持 float ,那么只需要把要比较的值转成 float 再把结果转回 int 就行了
    如何从两个 slice 取出交集呢:这个就复杂了,需要自己写一个库,而且每个类型都得写一遍哦
    aababc
        3
    aababc  
       2021-12-08 19:17:56 +08:00
    @Akiya 我怀疑你在黑 go ,但是我又没有证据。可能这就是大道至简吧!
    aababc
        4
    aababc  
       2021-12-08 19:20:24 +08:00
    从我个人的感觉来说,go 更多的考量是开发 go 是否更容易,而不是使用 go 是否更容易。使用者的方便与否可能不是重点考虑的范畴。
    partystart
        5
    partystart  
    OP
       2021-12-08 19:20:28 +08:00
    @iBugOne 总不可能每个项目都写一个 util 函数吧?

    就算你写的过来

    能让全公司都用这个库?

    js/java 这些直接在语言 sdk 层次封装好了

    谁闲得蛋疼 去做个统一库封装
    sagaxu
        6
    sagaxu  
       2021-12-08 19:26:37 +08:00 via Android
    less is more ,更少的语法糖,更多的代码量
    matrix1010
        7
    matrix1010  
       2021-12-08 19:47:19 +08:00 via iPhone
    你这看上去像是 ORM ,那可能是你的 ORM 不太行. 另外如果真的很多地方用并且模式差不多可以考虑写代码生成。This is the way
    Chad0000
        8
    Chad0000  
       2021-12-08 19:47:50 +08:00 via iPhone   ❤️ 1
    然而并不妨碍被国内追捧。

    珍惜生命,只写 C#。
    partystart
        9
    partystart  
    OP
       2021-12-08 20:22:50 +08:00
    @matrix1010
    就很正常的 http/db 调用

    根据 shop id 去 获取到商品 / extra/ item 信息

    最后根据 shop id 聚合起来。。

    三个 list

    聚合起成一个 map

    写了半天。。
    matrix1010
        10
    matrix1010  
       2021-12-08 20:36:13 +08:00
    @partystart 不太清楚你的实际情况,但如果让我写一个类似的接口差不多是这样。先用 ORM 查出数据与关联数据,shop = shop.query().where(id=1).withItems(func(q) {q.withextra()}).all(), 然后直接把这个 struct 转成 json
    6IbA2bj5ip3tK49j
        11
    6IbA2bj5ip3tK49j  
       2021-12-08 20:47:15 +08:00
    楼上都偏题了,这是没有泛型导致的,和 lambda 没关系。
    Buges
        12
    Buges  
       2021-12-08 20:51:06 +08:00 via Android
    @iBugOne 不能类型推导,还得加类型。js 是动态语言不用担心这个问题。现在有泛型了,你写个 filter 或 map 接口就知道有多难用了。
    pythonee
        13
    pythonee  
       2021-12-08 21:03:47 +08:00   ❤️ 1
    @Chad0000 羡慕能用 C#出活的同学
    labulaka521
        14
    labulaka521  
       2021-12-08 21:48:49 +08:00
    那就换个语言路,做之前不看吗?
    cmdOptionKana
        15
    cmdOptionKana  
       2021-12-08 22:55:54 +08:00
    @partystart

    造成你耗时长,一半原因是不熟悉,一半原因是心理厌恶导致感觉时间长。

    如果熟悉 Go 语言,虽然要多敲几下键盘,但实际也就多花几分钟,写程序又不是写小说,再麻烦也没多少字。
    EscYezi
        16
    EscYezi  
       2021-12-09 00:23:17 +08:00 via iPhone
    集合操作 funk 和 golinq 结合使用能省不少事,但是没范型还是差了点意思
    Trim21
        17
    Trim21  
       2021-12-09 00:30:32 +08:00 via Android
    直接用匿名函数不也挺方便的
    mind3x
        18
    mind3x  
       2021-12-09 00:39:58 +08:00   ❤️ 3
    是不是对 lambda 有什么误解?
    https://go.dev/ref/spec#Function_literals

    Golang 只是语法上比较 verbose 。并不是只有用 `=>`/`->`的才叫 lambda 。
    ACEonly
        19
    ACEonly  
       2021-12-09 09:01:06 +08:00
    go 泛型出來了啊
    yulon
        20
    yulon  
       2021-12-09 09:09:40 +08:00
    Go 不是有 lambda 也有闭包啊,我用了十年的假 Go ?
    wellsc
        21
    wellsc  
       2021-12-09 09:45:49 +08:00
    小而美
    libook
        22
    libook  
       2021-12-09 11:31:22 +08:00
    Go 是拿灵活性来换取生产效率的,特性少会使得实现方案少,当一个需求每个人的代码风格、实现方案都一样的时候,可以避免团队合作的很多问题。

    Go 是一款用于精准解决企业生产问题的产品,不适合用于满足个人对技术方面的追求。
    goxy
        23
    goxy  
       2021-12-09 13:03:14 +08:00
    littlewing
        24
    littlewing  
       2021-12-09 14:12:30 +08:00
    来用 C++ 20 吧,要啥有啥
    Akiya
        25
    Akiya  
       2021-12-09 14:26:02 +08:00
    @goxy 我看了一下这个库,今天跟 leader 申请了,看能不能引入。
    但是感觉代码还是很啰嗦,比如第一个例子,go 实现是
    ```go
    From(cars).Where(func(c interface{}) bool {
    return c.(Car).year >= 2015
    }).Select(func(c interface{}) interface{} {
    return c.(Car).owner
    }).ToSlice(&owners)
    ```
    但如果是 C#的话:
    ```cs
    owners = cars.Where(c => c.year >= 2015).Select(c => c.owner)
    ```
    masterclock
        26
    masterclock  
       2021-12-09 14:35:17 +08:00
    @Akiya 不仅啰嗦,而且全是 interface{}
    qq1340691923
        27
    qq1340691923  
       2021-12-09 15:15:22 +08:00
    有泛型就好点了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4059 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 05:16 · PVG 13:16 · LAX 21:16 · JFK 00:16
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.