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

2022 年最适合写业务代码的编程语言是哪个?

  •  1
     
  •   aljun · 2022-01-24 00:01:44 +08:00 · 25904 次点击
    这是一个创建于 1029 天前的主题,其中的信息可能已经有所发展或是发生改变。

    2022 年,各个语言已经有了长足的发展,但其实业界更多的需求还是写业务。

    这里写业务主要考虑的是解决问题的敏捷性与后期的可维护性扩展性,在性能层面要求不会特别的高,考虑的不只是语言本身的特性,还包括语言本身的生态。当然也需要考虑招人或者新人上手成本。其中业务泛指非计算要求极高的场景

    其中我觉得作为候选的为:

    • Java
    • Go
    • Python (特指有 asyncio 的 Python 3 )
    • Ruby (特指 Ruby3 )
    • Elixir
    • Scala
    • Javascript(特指 typescript )

    当然也不限上述语言,C++Rust就算了吧,用那个写业务首先在敏捷性就不太好

    因为限定为 2022 年,考虑的范畴都为该语言最新版本,且没有历史包袱

    提名请给出具体的理由

    233 条回复    2022-02-09 11:05:44 +08:00
    1  2  3  
    jeeyong
        101
    jeeyong  
       2022-01-24 17:40:59 +08:00
    做业务, 从整个开发人员生态, 和库生态来讲, 其实就是 java...
    就是好招人, 有近乎于标准的库去完成业务..
    当然,我选 python.....哈哈哈
    Ayanokouji
        102
    Ayanokouji  
       2022-01-24 17:43:29 +08:00
    kotlin 呀,有着 swift 的语法,享受着 java 生态
    SmiteChow
        103
    SmiteChow  
       2022-01-24 17:55:00 +08:00
    人生苦短,你懂了吧
    peyppicp
        104
    peyppicp  
       2022-01-24 17:57:21 +08:00
    Go 这个玩意,可以只卖服务,代码不卖
    java 嘛除非部署的是自己的服务器,否则就有被反编译的风险
    hongweiliuruige
        105
    hongweiliuruige  
       2022-01-24 18:08:41 +08:00
    ts 全栈解君愁
    BeautifulSoap
        106
    BeautifulSoap  
       2022-01-24 18:21:11 +08:00   ❤️ 9
    @Hanggi 做人不能太二极管,喜欢一门语言并不是要么爱死要么喷死。我喜欢 Go 并不意味着这些用得不爽的地方我也要用所谓“设计哲学”来洗脑自己让自己强行接受

    Go 的标准库健全吗?或许你可以说 Go 的标准库“健”,但绝对担不上“全”的名头。我希望你能摸摸自己良心问自己一句:Go 的标准库它好用吗?注意是“简单”“方便”“功能全面”这层面的意思,至少我觉得 Go 的标准库完全担不上这个名号。而且更别提 Go 标准库那令人一言难尽、写得让人摸不着头脑的文档(这点你还真别跟我杠,去年 JetBrains 做的调查,关于 Go 标准库文档,我记得有 50%左右的人都觉得这文档写得不得要领、无法获得有帮助的信息)
    INCerry
        107
    INCerry  
       2022-01-24 18:24:32 +08:00   ❤️ 1
    这个我站 C# C#挺香的 性能好 写的舒服 而且有个有钱的爸爸
    ychost
        108
    ychost  
       2022-01-24 18:31:02 +08:00
    C# 最佳,其次 Java/Node 吧
    OMGZui
        109
    OMGZui  
       2022-01-24 19:06:12 +08:00
    php
    basncy
        110
    basncy  
       2022-01-24 19:10:35 +08:00
    C 6G 业务.. 手动狗头.
    lisongeee
        111
    lisongeee  
       2022-01-24 20:30:25 +08:00
    md ,怎么没人说 kotlin 呢?
    GoLand
        112
    GoLand  
       2022-01-24 20:33:00 +08:00
    竟然还有人推荐 Rust ,很好奇真有人用这种语言写业务代码?
    Leviathann
        113
    Leviathann  
       2022-01-24 21:03:23 +08:00
    为啥有很多人说 kotlin 是 swift 的语法?
    kotlin 是 2011 年的 swift 是 2014 年的
    Timzzzzz
        114
    Timzzzzz  
       2022-01-24 21:06:58 +08:00
    公司用 nodejs ,加上代码写的很烂,可维护性极差
    UserNameisNull
        115
    UserNameisNull  
       2022-01-24 21:07:39 +08:00   ❤️ 2
    现在正在写 go ,写了一年了
    之前写了 4 年 java
    2 年 python
    相比之后排序的话,java ,python ,go


    go 真的不适合做业务的后端开发,写写云原生还行,写业务代码太痛苦,没泛型,没继承,没切面,没注解,除了 go 一下挺方便,其他没有优点了。
    Timzzzzz
        116
    Timzzzzz  
       2022-01-24 21:07:58 +08:00
    @Timzzzzz 但是应该跟用不用 nodejs 没关系,主要是代码写的烂
    cmdOptionKana
        117
    cmdOptionKana  
       2022-01-24 21:15:27 +08:00
    @GoLand 单就语法来讲,Rust 语法还蛮好用的,很先进,很多优点。最大的问题只是第三方库还是太少,生态没发展起来。
    hefish
        118
    hefish  
       2022-01-24 21:19:45 +08:00
    评选出了这样语言准备发奖吗?
    Hanggi
        119
    Hanggi  
       2022-01-24 21:23:31 +08:00
    @BeautifulSoap 逗,还给自己点赞。

    我现在理解你发牢骚是觉得,你不理解你要的那些功能 Go 语言为什么没有。
    如果你理解为什么没有这些功能,那你也应该明白目前的 Go 语言是不可能给你提供你要的那个功能。

    这不是标准库健全性的问题,你可以自己尝试实现一下,做个标准库的扩展包?
    然后再思考下你做的这个扩展库能放进标准库给别人用吗?
    如果行,说明标准库不健全,你去贡献代码,我给你买杯咖啡。
    如果不行那你抱怨的点又是什么呢。
    BeautifulSoap
        120
    BeautifulSoap  
       2022-01-24 22:28:14 +08:00   ❤️ 4
    @Hanggi
    1. V2EX 没法给自己点赞 2. 我也没开别的号给自己点赞 3. 这赞不是我给的
    你看到 1 赞第一反应竟然是我在给自己点赞,能有这种脑回路,看来你经常干用小号给自己点赞的勾当?不去参与刷赞黑产简直屈才了你

    我说的是 Go 标准库缺失非常多重要的基础功能导致标准库并不够好用,而你却一直企图用所谓的“你不理解为什么没有”之类的来蒙混过关。说难听点,我理解了又能怎样?能改变标准库事实上的确缺失很多基本功能,并不太好用的事实吗?并不能吧

    还有我想把一件事问清楚,你张口闭口 Go 标准库健全、健全、健全的,那么请问你这语境中的“健全”到底是什么意思?现代汉语对健全的解释“①强健而没有缺陷。 ②(事物)完善,没有欠缺”,结合这个解释,你是到底是想说 Go 标准库没有 BUG 呢,还是想说 Go 标准库已经十分完善,没有任何缺陷不用改了呢,还是 Go 标准库功能方面已经十分完美了?
    dany813
        121
    dany813  
       2022-01-24 22:34:21 +08:00
    nestjs 一把梭
    AnonymousM
        122
    AnonymousM  
       2022-01-24 22:49:16 +08:00 via Android
    kotlin 后端的前景有老哥了解吗,可以分析下吗。单写业务的话也是 spring 那一套还是有更灵活的解决方案?
    ByteCat
        123
    ByteCat  
       2022-01-24 22:49:34 +08:00
    Kotlin 一把梭,无论是 Web ( Spring Boot )还是 App ( Android )都很方便
    Leviathann
        124
    Leviathann  
       2022-01-24 22:53:38 +08:00
    @BeautifulSoap 没学过 go 我也想知道 go 标准库是什么概念
    和 kotlin 的拓展集合库比呢..
    Hanggi
        125
    Hanggi  
       2022-01-24 22:59:29 +08:00
    @BeautifulSoap
    你提出了你的抱怨,我给你解惑。

    你说说你要的功能是啥?不就是 Array 提供一个 filter 功能吗?这功能这么基础为啥 Go 语言没有,你能解释一下吗?

    而且你要的这功能基础到涉及不到标准库好吗?这是语言本身层面的功能,你老说标准库不全,你用的第三方软件哪个不是基于标准库和谷歌的扩展库开发的?你开发的时候遇到标准库功能不足,需要从底层扩展标准库才能实现吗?显然不是,你只是需要一个 filter ,所以不要再说标准库什么的,跟他没关系。

    说 Go 语言标准库健全是基于 Go 语言的发展年限、其他语言对比、目前所取得的成绩所提出的。Go 语言已经足以构建当代云原生服务的方方面面。你在这儿跟我说 Go 语言数组没有 filter 所以标准库不健全,恐怕不太合适吧?

    所以原因就是出在你不明白,明明你用的其他语言都有数组的 find ,forEach ,filter 等方便的扩展方法,为什么 Go 语言这么新、这么火、这么多大厂在后面背书结果连一个数组的 filter 都没有。你是不是应该去自己去搜一搜?而不是跟我赌气?我以前也很困惑为啥都 2020+年了,还有这种奇葩语言?查一查,翻一番,知道原因就不会抱怨了,因为没有一种语言是完美的。
    Leviathann
        126
    Leviathann  
       2022-01-24 23:16:40 +08:00
    @AnonymousM
    目前我们用的 spring 除了 orm 层 jpa 就是为了 java 的各种 null 和非 final 变量定制导致 kotlin 用起来有些别扭
    其他都没什么问题

    但前景也说不上,抱着 java 嗯卷的人太多了,而且普遍对语言没什么品味,碰到稍微精炼一点的语法就大呼不好维护不好合作 blabla
    BeautifulSoap
        127
    BeautifulSoap  
       2022-01-24 23:31:50 +08:00
    @Hanggi 所以呢,你在这说了半天,可依旧没有正面回答我的质问——你对“健全”这个词的定义到底是什么?

    你说了半天“基于 Go 语言发展”,“基于对比”什么的,可这些都不是对“健全”这个词的定义。讨论话题最怕的就是对某些概念的定义模糊而导致对话一直在做无用功。现代汉语词典对健全的定义是“①强健而没有缺陷。 ②(事物)完善,没有欠缺”,那你对健全的定义是什么?
    sagaxu
        128
    sagaxu  
       2022-01-24 23:39:58 +08:00 via Android
    @Hanggi 为什么 Go 语言这么新、这么火、这么多大厂在后面背书结果连一个泛型都搞到 2021 年尾才出来,还是个不支持泛型方法的泛型,比类型擦除的伪泛型更狠。

    同样是很火的新语言,rust 除了编译速度,各方面都比 go 强太多了。
    Hanggi
        129
    Hanggi  
       2022-01-25 00:06:47 +08:00
    @BeautifulSoap
    我不是已经说了吗? Go 语言已经可以构筑当代云原生的从底层到应用的方方面面,且大部分都是纯 Go 语言写的。
    这就已经说明其标准库(包括谷歌扩展库)已经很健全了,可以应付各种情况,这不是健全那是什么?
    主流语言有几个能做到且做好?

    我说的健全指的是:Robust 。这个词翻译过来就是健壮、健全、强壮的意思,所以我的表达也没有问题。

    所以不要跑题,Go 语言在语言层面上有很多基础功能不完善,你可以认为这事缺陷,但是究其原因是 Go 语言的本身设计导致的,推荐你去了解下。(与标准库无关,Go 语言标准库与其他语言标准库相比,已经算是比较健全的,事无绝对嘛)
    Hanggi
        130
    Hanggi  
       2022-01-25 00:09:40 +08:00
    @sagaxu Rust 与 Go 不是相同定位语言,Rust 更偏向于底层,Go 语言应用层级会更高一些。

    我就跟你说一件真实发生的事情,Linkerd 知道吗?其最初版本是 rust 写的,后来因社区支持有限发展受阻改成 Go 语言。
    当然这可能是个例,仅供参考。
    MintZX
        131
    MintZX  
       2022-01-25 00:28:31 +08:00 via iPhone
    Go 吧,虽然我不会 go ,但是前两天公司里还在讨论要不要把当前的 python 换成 go 。各种 banchmark 好了太多
    magiclz233
        132
    magiclz233  
       2022-01-25 03:22:33 +08:00
    java 吧 业务的话 首先要使用的人多 另外开源库众多,java 生态很成熟了 而且在设计的时候考虑好扩容,后续也好操作,当然 java 也有缺点就是繁琐,不过如果业务代码多了项目大了其他的更乱
    binux
        133
    binux  
       2022-01-25 03:52:10 +08:00 via Android
    写业务为什么还要有 asyncio ?
    业务里面还要直接操作 IO 的吗?难道不是上面包装好一层 API ,下面包装好一层 framework ,业务只管调用然后 return 就行了吗?
    bthulu
        134
    bthulu  
       2022-01-25 09:03:22 +08:00
    @kran java 不行, 调 dll 太麻烦了, 很多硬件设备也没有 java 原生驱动
    sty
        135
    sty  
       2022-01-25 09:08:44 +08:00
    @AnonymousM spring 那套,100%与 Java 正常交互
    bthulu
        136
    bthulu  
       2022-01-25 09:10:20 +08:00
    @wdhwg001 请教个问题, C#的 controller, 默认是 scope 的, 后面的服务类, 你们用的也是 scope 吗?
    如果用的是 scope, 那么需要在多个请求间共享数据怎么办, 写在静态字段里? 如果需要在这个类创建后执行一次操作, 且仅执行一次, 怎么办, 难道写个静态字段标记是否执行过, 然后每次在构造函数里去判断一下?
    如果用的是 singleton, 那么数据库怎么访问? DbContext 是 scope 的, 是没法注入到 singleton 的. 难道是在所有需要数据访问的方法里都加一个 DbContext 的入参, 由 controller 统一传递过来吗? 这样写是不是太恶心了, 某个方法如果自己本身不需要访问数据库, 但是他调的某个方法需要访问数据库, 那这个时候也不得不把 DbContext 作为入参传递. 或者是入参里没有 DbContext, 需要的时候通过工厂方法直接创建一个? 那这样的话, 跨方法事务又该怎么处理?
    用了一段时间的.net, 总感觉各种恶心不好用, 貌似什么功能都有, 但什么功能都做的让人恶心不好用
    lybcyd
        137
    lybcyd  
       2022-01-25 09:10:56 +08:00
    @Hanggi 杠一下,robust 根据韦氏词典定义
    1: strong and healthy
    2: strongly formed or built
    3: successful or impressive and not likely to fail or weaken
    仅仅有健壮的含义,没有健全的含义。现代汉语的健全不仅仅包含健壮的含义,还包含完善完全的含义。

    Go 的选择和现状有它自己的理由和设计理念,这个大家都明白,但是非要说它标准库很健全就有点强行挽尊了。
    bthulu
        138
    bthulu  
       2022-01-25 09:18:40 +08:00
    @popil1987 typescript 有个很严重的问题, node_modules 文件数量多的吓人, 动辄几十万个文件, 复制删除 install 慢到令人发指. 如果一整年就开发一个项目, 那 install 一次就好了, 问题不大. 但像我这边这样, 针对工厂开发的, 每个厂都有其独特的生产情况, 只能公用部分代码, 不得已只能按工厂建分支. 那你今天可能在搞 A 厂, 突然之前的 D 厂说有沙问题, 要处理一下, 又切回 D 厂, 那依赖也不完全一致, Install 一下几分钟就过去了. 改完测测发布到 D 厂, 又切回 A 厂, 继续 Install. 过了个吧小时, E 厂又反馈哪里不好用要改改, 又切又 install, 完蛋了啊.
    dragonsunmoon
        139
    dragonsunmoon  
       2022-01-25 09:20:37 +08:00
    @Hanggi BeautifulSoap 的 "第一个赞" 是我给的, 因为他的观点我认同.
    go 语言有他的设计哲学和思想, 可是未必是所有人都认同和接受的.

    编程语言只是一个工具而已. 现实生活工作里, 很多人, 因为公司, 项目是使用 go 语言, 而不得不使用. 因此在论坛里发表一下对 go 语言的吐槽和抱怨, 很正常, 无可厚非.

    编程语言, 程序员用来工作谋生的工具而已, 你觉得好用, 你继续喜欢. 我觉得不好用, 我就吐个槽, 报个怨呗. 没有必要, 非要争一个对与错, 强迫其他人都的认同.
    fanxasy
        140
    fanxasy  
       2022-01-25 09:32:36 +08:00
    候选列出了 Elixir 却没有 C# 怪怪的
    w0017
        141
    w0017  
       2022-01-25 09:34:27 +08:00
    python 没有多线程真是个 xxx 的事情。
    james122333
        142
    james122333  
       2022-01-25 09:55:45 +08:00
    @UserNameisNull
    继承可以用 type embedding 加上 interface 定义共通函数
    切面你可以自己实现 注释如果你了解如何读取"//注释"或者"/* 注释 */"你一样可以实现 php 上就是这样的 当然不是如同 java 上额外区分
    miv
        143
    miv  
       2022-01-25 09:58:36 +08:00 via Android
    毋庸置疑,我选 PHP ,tp6
    lujiaosama
        144
    lujiaosama  
       2022-01-25 09:58:57 +08:00
    @3dwelcome LZ 都限定了 ts 了, ts 没你说的那些缺点. 现在连前端都不直接写 js 了.
    james122333
        145
    james122333  
       2022-01-25 10:02:09 +08:00
    @UserNameisNull
    基本上差不多就是
    (随你定义)

    /**
    *@Annotation1
    *@Annotation2
    */
    yishuihanxiao
        146
    yishuihanxiao  
       2022-01-25 10:07:46 +08:00
    既然说到业务,难道不是无脑上 java 吗?
    fredli
        147
    fredli  
       2022-01-25 10:15:58 +08:00
    kotlin, swift 啊,有平台有生态
    daimazha
        148
    daimazha  
       2022-01-25 10:17:17 +08:00
    c#
    FightPig
        149
    FightPig  
       2022-01-25 10:32:10 +08:00
    @Hanggi 个例说明不了什么,还有 go 不行,换成 rust 的,语言这东西,主要看公司人才用哪个方便用哪个,说 go 写业务不行吧,看 b 站就 go 写的,
    liaohongxing
        150
    liaohongxing  
       2022-01-25 10:38:20 +08:00
    大部分批评 Go 的,都是没用过 GO 的。GO 标准库随便起一个端口 。随便压测就是 QPS 上万 。不需要交叉编译 。windows 直接编译 linux 或 arm 二进制, 你要是有 QPS 需求。换 GO 绝对没错
    Hanggi
        151
    Hanggi  
       2022-01-25 10:44:41 +08:00
    @lybcyd emmm ,这个杠其实说服力不大。

    首先这个定义里也说了:成功的、令人印象深刻,且不太会失败或变弱。
    这与中文定义的:完备的、健康的、而无缺陷的。

    大致匹配,你非要说不同,也没办法。
    但是我上面也说了,“Go 语言标准库与其他语言标准库相比,已经算是比较健全的”。
    libook
        152
    libook  
       2022-01-25 10:47:54 +08:00
    1. “解决问题的敏捷性与后期的可维护性和扩展性”:这个主要是架构设计、代码制度的问题,跟语言本身的关系不大;正所谓水平烂的程序员用什么高大上的语言写出来的代码都一样烂。
    2. “在性能层面要求不会特别的高,考虑的不只是语言本身的特性,还包括语言本身的生态”:5 年内流行起来的语言基本还需要开发者自己造不少轮子,持续火的时间越长生态越好,火超 10 年的技术栈甚至有完备的中文文献和社区。比如 Java 、Python 、JavaScript 。
    3. “当然也需要考虑招人或者新人上手成本”:越贴近人类思维,抽象程度就越高,暴露底层细节就越少;语言灵活性越低,需求的可选实现方案就越少,花在方案选择上的时间越少,对开发者要求就越低。当然不同语言在不同特性上的简单和复杂程度是有差异的,造就了不同语言的适用场景的不同;其实大多语言本身学起来都很简单,难的是框架、库、思想。

    团队协作,以及规模化、流水线化生产,我个人推荐 Go 和 TypeScript ,因为灵活性低且性能足够,能避免不少问题,不过 Go 的生态还是免不了自造轮子。
    个人兴趣向开发就什么顺手、喜欢什么就用什么,有的人就是喜欢使用一些高大上的语言来雕琢,以让自己获得工匠式的满足。大多情况下语言不是瓶颈。

    P.S. 刚学了 Rust ,个人感受是很多特性是十分先进和巧妙的,对于本身进行系统开发工作(也就是绕不开 C\C++等较低抽象的语言)的团队来说,Rust 在提升产能和产品质量方面是有显著成效的。
    P.P.S 任何达到一定规模的项目都难以使用一种技术栈做到面面俱到,在多种语言的方案中进行选择也是可以考虑的。
    fan88
        153
    fan88  
       2022-01-25 10:54:43 +08:00
    过分 PHP 凭什么不配有姓名
    qbhy
        154
    qbhy  
       2022-01-25 10:57:04 +08:00
    显然是 go ,依赖注入、服务容器等骚操作,go 也可以的
    qbhy
        155
    qbhy  
       2022-01-25 10:57:27 +08:00
    @qbhy 对就是这个框架了 https://github.com/goal-web
    Hanggi
        156
    Hanggi  
       2022-01-25 11:00:33 +08:00
    @dragonsunmoon
    同意,

    很多人接触 Go 都是先有过其他语言的开发经验,这种情况下很容易就会进行横向对比,问为什么这么方便的功能 Go 语言没有,然后就开始抱怨吐槽,这当然无可厚非。

    我的观点也很清晰,之前那位说的缺点确实是 Go 语言的一些设计导致的,且短时间不太会提供解决,与标准库无关。
    既然是这么设计的,那更应该查一下为什么这么设计,这么设计的初衷是什么,带来了这些不便利的同时是否为我们的开发工作带来了其他收益。
    libook
        157
    libook  
       2022-01-25 11:04:37 +08:00
    上面的楼非常符合预期地对 Go 产生了争议。

    我个人的理解是这样的:Go 是一款专门 Hack 企业生产过程中的各种问题的一款“产品”,特点就是灵活性低,由此带来的优点就是一种需求只有一种解决方案,千人一面,避免团队个别人整“花活儿”,由于很多需求都有“标准方案”,程序质量也不会因为个人水平差异差太多,以个人的束缚来换取团队的高效生产。这一段的描述可能稍有夸张,不过是为了说明我所理解的 Go 的设计方向。

    所以很多人指出的 Go 的缺点,多是自己被束缚而产生的不快,但站在企业产而的角度上来说,这些都是值得的牺牲。
    pythonee
        158
    pythonee  
       2022-01-25 11:16:10 +08:00
    @wdhwg001
    @maplerecall
    @afirefish

    c#的生态有那么好了吗?我觉得 java 主要是生态强,或者说直接依赖开源项目可以快速出货
    Wincer
        159
    Wincer  
       2022-01-25 11:17:02 +08:00
    https://www.v2ex.com/t/829884?p=2 这楼里的人完美诠释了这个帖子
    haochen2
        160
    haochen2  
       2022-01-25 11:23:06 +08:00
    @BeautifulSoap 说真的,Go 标准库就是最好的教材,没有之一。多少大牛的经验都在这里面,十分值得学习的。
    liuxu
        161
    liuxu  
       2022-01-25 11:26:52 +08:00
    没有不健全的语言,只有不健全的大脑

    我不是在指谁,我只是根据我的个人签名想到了一个好好笑的谐梗,忍不住说出来

    道理我都懂,我用 rust
    liuxu
        162
    liuxu  
       2022-01-25 11:32:35 +08:00
    考虑到 springboot 的便利性,laravel 强悍,go 的性能

    任何项目都用 php 和 java
    超高性能 api 用 go
    爬虫和数据分析用 python

    其实 go 可以和 php/java 项目混用,做高级读 cache 层,从 twitch 泄露出来的项目来看,ruby + php/laravel + go
    v2exe2v
        163
    v2exe2v  
       2022-01-25 11:35:15 +08:00
    python, 面向 google 编程
    pengtdyd
        164
    pengtdyd  
       2022-01-25 11:43:34 +08:00
    为什么没有 PHP !!!!!!!!!! PHP 天下第一,有谁不服的吗?
    lybcyd
        165
    lybcyd  
       2022-01-25 12:02:06 +08:00   ❤️ 1
    @Hanggi 这个两个词的区别就是完备、完善。当然了,其实争这个没多大意义,深究起来就是抠字眼罢了。
    回到主题,Go 的确很坚持他自己的那一套哲学,这是他和其他主流语言不同的地方。这样设计当然有他的道理,但是大多数人写业务代码不会去追究那么深,无非就是快速、清晰、方便地实现业务。这种情况下,当然是标准库 API 越丰富越好,例如完善的集合处理 API 可以大大提升开发速度,同时又有着很好的可读性,filter.map.join 这一串显然要比 for 、if 之类的套来套去要舒服多了。在这方面上 Go 的确是比不了其他语言。当然,Go 的优点也有很多,只不过楼主只针对堆砌业务代码这个场景而已。
    Itoktsnhc
        166
    Itoktsnhc  
       2022-01-25 12:03:50 +08:00
    @bthulu
    多个请求之间共享数据是个什么操作? 有更具体一点的例子嘛。
    controller 的确是 scoped 的。
    如果需要在 singleton 中调用 lifetime 更短的服务可以考虑直接注入 IServiceProvider /相对应的 Factory(如 IDbContextFactory<xxxDbContext>)
    ``` c#
    using var scope = _sharedSp.CreateScope();
    var sp = scope.ServiceProvider;
    var svc = sp.GetRequiredService<IXxxService>();

    ```

    ``` c#

    await using var context = _dbFactory.CreateDbContext();

    ```
    ila
        167
    ila  
       2022-01-25 12:04:49 +08:00 via Android
    @BeautifulSoap 自己写模版,根据 sql 表生成了
    Itoktsnhc
        168
    Itoktsnhc  
       2022-01-25 12:17:01 +08:00
    @Itoktsnhc
    如果要实现类创建后执行一次这种事情 C#中有 Lazy<T> 不需要用静态字段标记这种比较麻烦方法

    总结一下:
    1. controller 是 scoped 所以对应的 service 生命周期最好要<=scoped
    2. 请求之间共享内容一般借助缓存(MemoryCache?/Redis/DB)吧,asp.net core 有自己的 IMemoryCache,配合 Lazy<T>可以做到线程安全的延后初始化
    3. 长生命周期内想调用短生命周期的 svc 可以通过注入 IServiceProvider 的方式实现
    4. 防止构造函数注入的 svc 过多,可以使用 MediatR 类的库。
    5. 跨方法事务 dotnet 中有 TransactionScope ,可以在跨方法调用中使用, 很方便
    BeautifulSoap
        169
    BeautifulSoap  
       2022-01-25 12:30:03 +08:00   ❤️ 1
    @Hanggi 等等,你都没发现自己说的话前言不搭后语有问题??

    “Go 语言已经可以构筑当代云原生的从底层到应用的方方面面,且大部分都是纯 Go 语言写的。这就已经说明其标准库(包括谷歌扩展库)已经很健全了”

    你前面说的是 **Go 语言** 已经可以构建当代云原生的方方面,但 Go 语言 ≠ Go 语言标准库 ,你到底是通过怎样一层逻辑转换才通过 Go 语言可以构建当代应用得出了标准库已经很健全的结论了?

    难道你想说的是“通过 Go 标准库可以构建当代云原生方方面”? 并且结合你对健全的定义是“Robust",那么我们就以你对“健全”的这个定义来做个最极端假设:
    假设有一个叫“mini Go 语言标准库”的标准库,这个 mini 标准库除了 runtime 这种没法自己直接实现的功能之外不存在任何其他功能(包括 json 、re 、sort 这些全都没有)。通过你对“健全”的定义:

    1. 通过这个 mini 库你完全可以构建现代云原生应用的方方面(唯一区别就是你需要自己实现 json 、re 、sort 所有这些轮子罢了)
    2. 然后因为这个 mini 库功能小到极致,所以其足够安全、强壮、稳定

    那好,根据你对“健全”的定义,这个功能少到极致的 mini 标准库也能被称为“健全”,对不对?
    zoharSoul
        170
    zoharSoul  
       2022-01-25 12:39:18 +08:00
    @Hanggi #119 你已经自我洗脑成功了
    Goooooos
        171
    Goooooos  
       2022-01-25 12:51:50 +08:00 via Android
    感觉有人已经把 go 当成圣经,开口闭口设计理念和哲学
    没有 filter 就没有了,就像没泛型
    Hanggi
        172
    Hanggi  
       2022-01-25 12:53:53 +08:00
    @BeautifulSoap
    怎么还 json ,sort 啥的都没了,你看了标准库吗?

    你能有点逻辑吗?我说的不够清楚吗?

    如果有一个你觉得应该存在于标准库的功能,但是标准库没有,那么请你去 Gerrit 上贡献你的代码。
    去完善标准库,你去尝试去实现你所说的那些没有的功能。好吗?而不是在这儿抱怨?

    任何人都可以去贡献啊,你说数组没有 filter ,你写个 filter 到 Go 语言标准库里,跟他们说:“你们的标准库不太完善,我帮你们完善一下,填补标准应该有的基本功能”。ok ?
    如此基础的功能应该谁都能实现吧?标准库不健全,那么就请完善它。
    如果觉得麻烦,你可以把你的实现代码发出来,让大家一起讨论讨论,如何?

    @zoharSoul 你也被上面这个人洗脑了?
    这么清晰的逻辑,你能不能也通过自己的大脑思考一下呢?
    或者说你也想去贡献一下?
    starcraft
        173
    starcraft  
       2022-01-25 13:00:04 +08:00 via Android
    这还需要问吗?业务就是 java+js ,目前已经无敌了,没有任何其他语言能构成威胁。想类似 php 这种,一定一年不如一年,能活下去也是越来越往鄙视链底层走、薪资底层走。
    BeautifulSoap
        174
    BeautifulSoap  
       2022-01-25 13:07:32 +08:00
    @Hanggi 你的回复简直驴唇不对马嘴,对牛弹琴。建议重看我的 169L
    h82258652
        175
    h82258652  
       2022-01-25 13:11:14 +08:00
    培训班教哪门就选哪门吧
    手动狗头

    还要考虑招人和成本,这怎么选,现在 .NET 都没几个培训班了,见得最多就 Java 和 Python 。
    liaohongxing
        176
    liaohongxing  
       2022-01-25 13:17:54 +08:00
    @BeautifulSoap

    Go 的标准库已经很完善了。json base64 正则 图片 http http2 socket 时间 sort 字符串 文件 加密 html 定时器 等等全都有可以说是很健壮 。

    你要是介意没有 filter 也可以继续喷,这个没法
    Hanggi
        177
    Hanggi  
       2022-01-25 13:21:02 +08:00
    @BeautifulSoap
    我其实早就没兴趣给你说通什么,只是太多人有你类似的想法,进而误导更多人。

    你做假设的时候能匹配上你刚开始的言论吗?健全这件事已经没必要再纠结了,我上面也说了,横向对比其他语言,Go 语言标准库已经算是比较 Robust 的了。

    我现在只想看看你到底怎么为 Go 语言标准库做贡献,完善你说的那些缺陷,我也好学习学习。
    你现在已经脱离了最初的论点,揪着“健全”讲个没完,能把你一开始抱怨拿出来说说吗?
    数组没有 filter ,你来解决一下,代码发出来给大家看看,好不好?
    (我本来不想这么说的,但是你开始耍 wu lai 了嘛,那就拿出点东西,证明一下标准库连这么简单的功能都没有。)
    cover
        178
    cover  
       2022-01-25 13:22:17 +08:00
    你们慢慢讨论,我写 kotlin 去了
    wdhwg001
        179
    wdhwg001  
       2022-01-25 13:33:55 +08:00 via iPhone
    @pythonee 国内生态一般,国外的还行,感觉该有的都有。

    这个问题主要聚焦的是业务代码,而在这种 CRUD 方面的话,c#的 ef 简直把国内经常用的 mybatis 这种半自动 orm 按在地上打,并且也比 hibernate 这种全自动武器好用不少。
    alpha1130
        180
    alpha1130  
       2022-01-25 13:40:40 +08:00
    PHP
    NeroKim
        181
    NeroKim  
       2022-01-25 13:40:42 +08:00
    PHP
    wdhwg001
        182
    wdhwg001  
       2022-01-25 13:45:38 +08:00 via iPhone
    @bthulu 多个请求间共享数据?这是什么操作,试图在进程内或实例内共享数据本就不是正确实践。

    你不拿个 redis 一类的的话以后扩容怎么搞,而且 c#要是崩了的话数据咋办。

    把一个完整业务流程求导本就是 web 开发的架构能力,你看像传统 php ,请求和请求之间都不是一个进程。
    liaohongxing
        183
    liaohongxing  
       2022-01-25 13:56:30 +08:00
    @Hanggi 你已经有点无聊了。Go 标准库算健壮 ,这我也同意 。但是没有 filter 就是没有 filter ,人家喷的也是这个 。你叫人家贡献 ,Go 社区也不会收,没有达到主线贡献者 ,发言权也没有。索然自己写个 filter 都能解决。

    归根到底没有泛型,强类型没有泛型做不好 filter 的。后面 1.18 出来有个集合操作,里面就有集合的操作 。

    Go 还有个 error 。这个是问题,也不是问题 。error 设计的好 。也没问题, 基本上两个大喷点无法反驳 。
    iyaozhen
        184
    iyaozhen  
       2022-01-25 13:59:14 +08:00
    实话实说 JAVA 没有之一

    虽然现在写 Go
    3dwelcome
        185
    3dwelcome  
       2022-01-25 14:06:22 +08:00
    @lujiaosama “LZ 都限定了 ts 了, ts 没你说的那些缺点. 现在连前端都不直接写 js 了.”

    这就和那句 Any application that can be written in JavaScript, will eventually be written in JavaScript.一样。

    理论上你能用 JS/TS 写出任何代码。

    而事实上,那些复杂的大应用,大家都在用别的语言,翻译成 WASM 后,使劲往 JS 里搬运。

    当然你要说公司前端写来写去,就是那些表单开发,没任何深层次的功能和算法,那么 TS/JS 还是够用的。
    BeautifulSoap
        186
    BeautifulSoap  
       2022-01-25 14:20:44 +08:00
    @liaohongxing 我真的怀疑你到底有没有用过 Go 语言或者拿 Go 语言开发过很多项目,一天到晚盯着我说的 filter 说事,我原话是”除此之外还有很多功能也同理”,这里的"很多功能看到没”?
    你如果真的经验足够,参与项目够多,你就会发现标准库里除了没有 filter ,还没有数组 insert ,没有返回 max ,min 元素,除此之外获取 map 中的所有 keys ,values 也没有,等等等等并不少。当然这些功能非常简单很多时候一两行就写完的东西,但每到个新项目就都复制粘贴一遍,我觉得这体验“不爽”“很难受”,有问题?难道对你来说每次都要复制粘贴一次是一件非常有快感的事情?还是说你平时开发经验缺乏到连这些现代语言都基本默认内置的功能都没用到过?

    至于我一直懒得反驳你让我贡献代码这点,是因为我真得觉得你这说法太奇葩了,多少年都没见过的 you can you up 言论没想到还能在这见到。
    你这行为和顾客去餐厅吃饭觉得做的菜有一些地方不太好吃,然后你就跳出来说 “厨师烧得不好吃是有原因的,请你了解厨师为什么烧得不好吃,理解到之后还觉得不好吃那就是你的问题。并且你真觉得不好吃那就请你来改良厨师的菜谱和制作工艺,让我来看看你改良的菜谱到底行不行”
    对于你这种耍无赖行为我只能说,你挺棒的
    bthulu
        187
    bthulu  
       2022-01-25 14:23:19 +08:00
    @Itoktsnhc 你这个有解决跨方法事务问题吗? 没有. 你这个只是在方法内完成了数据库操作, 多个方法间咋办, 完全不考虑事务吗? 还是传递 DbContext? 那如果这几个方法的调用顺序是不固定的, 是不是要在调用这几个方法的外部再创建一个 DbContext 依次传递进去? 那如果突然这个外部方法又需要跟其他方法一起联动且维持事务一致, 是不是这个外部方法又得加一个 DbContext 参数再由外部的外部方法来创建 DbContext? 那如果后面业务再次变动了呢? 你怎么处理? 你不要说你们业务简单不存在这个问题.
    Hanggi
        188
    Hanggi  
       2022-01-25 14:29:20 +08:00   ❤️ 1
    @liaohongxing 我也觉得自己挺无聊的。

    但是最近看到太多奇葩的言论,实在是看不下去。

    类似,关系型数据库不要用 join ,API 接口全部用 POST 因为更安全,接口统一回复 200 ,Go 语言没有 filter 所以标准库有缺陷等等。。。
    你可以这么用,你们公司也可以这么规定,每个人都有自己的决定权,虽然明白这是国内的现状,但...看到满屏幕这种奇葩言论,还好多人点赞附和,emmm...可能我确实有点无聊吧
    bthulu
        189
    bthulu  
       2022-01-25 14:31:10 +08:00
    @wdhwg001 实例共享数据不是正确实践, 那什么是正确实践? 假如说你自己实现一个 redis 连接池, 那么你是不是要保存池子的最大最小连接数, 当前连接数, 当前连接状态. 获取连接难道不是多线程的, 难道不用根据这些状态参数来确定是返回池子里现有的空闲连接, 还是新创建一个连接, 或者干脆等待一个空闲连接? 这些状态数据不存在连接池实例里, 你存哪里? 放到数据库里去么?
    duke807
        190
    duke807  
       2022-01-25 14:38:10 +08:00 via Android
    討厭 rust 、typescript 、java 、c++、c#

    後端用 python ,前端用 vanilla javascript ,MCU 用 c

    python 我用來做芯片研發( cocotb )、工業生產工具、gui 軟件、服務器後台、機器學習在內的各種算法、kicad freecad blender 等開源軟件的 api 接口都是 python
    BeautifulSoap
        191
    BeautifulSoap  
       2022-01-25 14:42:45 +08:00
    @liaohongxing 我真的不否定 go 标准库健壮性,想表达的意思是 go 标准库在一些基本又简单的功能上存在缺失,而这些功能又是几乎所有项目都必须要用的,导致每次要用的时候都得自己写一遍或复制粘贴一遍,体验不爽也不好(但这并不代表我就要否定标准库,说他垃圾之类的,做人又不是二极管,没必要非黑即白)。
    而且我用 go 开发了不少项目,这方面少的功能不光是 filter ,还有没有 insert 元素到切片,没有返回 max 、min 元素这些基本功能,map 没有获取 keys 和 value 之类的,等等等等。当然我要明确一点就是这些功能实现起来的确很简单 for 循环几行的事,但每次用到这些其他语言大多内置的功能的时候,都不由地觉得 go 标准库在这方面不太方便

    我想表达的也仅此而已
    Leviathann
        192
    Leviathann  
       2022-01-25 14:56:09 +08:00 via iPhone
    @wdhwg001 hibernate 这种重型武器我们都不敢用,高级功能基本都 disable 了
    基本就用个 jpa 根据接口方法名自动生成查询的功能。。其他的复杂查询都是用 jdbc
    好在 kotlin 拼 sql 比较方便。。
    liaohongxing
        193
    liaohongxing  
       2022-01-25 15:10:45 +08:00
    @BeautifulSoap 你提的这些点全都跟泛型有关, 有 maxInt 那就配套的 maxFloat maxUint maxInt64 , 有泛型统统解决,一个泛型方法就行 , min 类似 minFloat minUint minInt64 , max 类似 maxFloat maxUint maxInt64 ,

    有了泛型才有 map 容器 ,才能 insert , 才有 keys values , 才能有同类型的 keys , 不然又是 mapInt mapFloat mapUint mapInt64

    列表容器类似, 归根到底泛型问题 ,现在泛型方案出来了 。相信这些马上就有。下面是容器的实验版本:

    https://cs.opensource.google/go/x/exp/+/master:maps/maps.go

    https://cs.opensource.google/go/x/exp/+/master:slices/slices.go

    https://cs.opensource.google/go/x/exp/+/master:slices/sort.go

    https://cs.opensource.google/go/x/exp/+/master:slices/zsortfunc.go
    BeautifulSoap
        194
    BeautifulSoap  
       2022-01-25 15:49:44 +08:00
    @liaohongxing 十分感谢你能理解我想表达的意思,其实这些我也是知道和泛型有关的,所以我 14L 有说 “希望这方面能随着接下来泛型的发布有所好转”,也是在期待 1.18 发布后这方面有能逐渐补上的可能性(不过 go1.18 因为怕泛型引入的不确定性所以暂时不会大改标准库,估计真要动的话也是要下几个版本了吧)
    Hanggi
        195
    Hanggi  
       2022-01-25 15:53:38 +08:00
    @Goooooos
    其实你稍微了解下就能明白,不是说当圣经,而是 Go 语言确实有一些独特的设计思想。

    你觉得 filter 和 泛型这类几乎所有语言都有的东西,谷歌那些开发者们不知道吗?

    而 Go 语言的设计思想里就有一条就是能用一种简单方法解决的问题就没必要给你第二种。
    所以你会发现 if else 可以解决问题,所以不会给你三元运算符(还有一个原因是三元运算符容易被 abusing )
    for 循环可以解决的问题,就不会给你 while 循环和 forEach 循环。

    而这种设计思想到底让我们的开发更简单了还是更复杂了是见仁见智的。
    但是反观 Go 语言今天的成绩,说明这种思想正在被越来越多人所接受,他们在用这种设计思想开发更多有意义的服务。
    这时你就要回来反思,这种看似好麻烦的设计为什么会被这么多人接受?
    liuxu
        196
    liuxu  
       2022-01-25 16:06:30 +08:00 via Android
    @duke807 他們說的好高級,我聽不懂誒,我都是用 c 寫 web ,畢竟我的伺服器芯片只是一片小小的 8 位 attiny4 ,只有 32byte ram ,也不知道能不能跑抓哇狗浪
    Soar360
        197
    Soar360  
       2022-01-25 16:27:24 +08:00
    我觉得是 PHP
    FirefoxChrome
        198
    FirefoxChrome  
       2022-01-25 19:22:51 +08:00
    C# 但是国内工资真的低
    3dwelcome
        199
    3dwelcome  
       2022-01-25 20:11:58 +08:00
    @liuxu 用 C 写 Web ,你还要考虑内存对齐之类的琐事,巨麻烦。

    还是简单封装一下,用 lua 写逻辑都要好不少。
    james122333
        200
    james122333  
       2022-01-25 20:13:03 +08:00
    @Hanggi
    还是有 用反射 不过效能很差... 正在研究
    1  2  3  
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5619 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 08:01 · PVG 16:01 · LAX 00:01 · JFK 03:01
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.