V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
vchroc
V2EX  ›  程序员

Go 特性少,语法糖太少,味儿苦啊!求开发体验好、生态全的语言推荐

  •  
  •   vchroc · 2022-05-12 12:42:20 +08:00 via iPhone · 15864 次点击
    这是一个创建于 951 天前的主题,其中的信息可能已经有所发展或是发生改变。

    包括不限于错误 /异常处理,泛型,OOP 等, 还有就是缺失类似 spring 的 bean 扫描功能

    152 条回复    2023-08-23 23:43:10 +08:00
    1  2  
    frisktale
        1
    frisktale  
       2022-05-12 12:53:04 +08:00   ❤️ 12
    C#咯
    snoopyhai
        2
    snoopyhai  
       2022-05-12 12:53:37 +08:00 via Android
    ts?
    Mistwave
        3
    Mistwave  
       2022-05-12 12:53:48 +08:00 via iPhone
    用 Scala/Kotlin 写 Spring
    liuzhaowei55
        4
    liuzhaowei55  
       2022-05-12 12:56:43 +08:00 via iPhone   ❤️ 1
    试试全世界最好的语言?
    BeautifulSoap
        5
    BeautifulSoap  
       2022-05-12 13:00:21 +08:00   ❤️ 6
    Kotlin ,语法糖多到光是学语法糖就能学到吐血
    vchroc
        6
    vchroc  
    OP
       2022-05-12 13:02:22 +08:00
    @frisktale C#不错,但生态怎么样?
    vchroc
        7
    vchroc  
    OP
       2022-05-12 13:06:07 +08:00
    说下几点要求:
    1 、便捷的异常错误处理;
    2 、低开销的抽象成本;
    3 、云原生,编译产出物是直接可以运行的二进制文件
    4 、Bean 自动注册与发现,避免手动维护某个集合
    5 、完善的特性支持如泛型、枚举、反射等
    6 、完善的生态,主要关注 Web 方面
    yjll9102
        8
    yjll9102  
       2022-05-12 13:08:24 +08:00
    Groovy 啊,生态不用说了就是 Java 的生态,语法糖也可以,现在还加入了 LINQ 语法的支持
    MakHoCheung
        9
    MakHoCheung  
       2022-05-12 13:10:57 +08:00
    @vchroc Kotiln + Spring + Graalvm 完全满足你。但是要等年底的 Spring Native ,现成的你可以 Kotlin + Quarkus
    ration
        10
    ration  
       2022-05-12 13:11:13 +08:00 via Android
    生态还是选 java 吧,开发体验这些熟了也就那样
    MakHoCheung
        11
    MakHoCheung  
       2022-05-12 13:13:47 +08:00
    @vchroc 不过 AOT 跟 反射好像鱼与熊掌不可兼得?看后面大佬怎么看这点
    Hanggi
        12
    Hanggi  
       2022-05-12 13:14:11 +08:00   ❤️ 12
    楼主用回你的 Spring 就好了呀?

    Go 语言用得好的不管写 Web 还是写微服务什么的,早就写得飞起了。

    思想转变不过来没必要强求,用你能接受的就好了,为什么还要换来换去呢?
    BrettD
        13
    BrettD  
       2022-05-12 13:15:04 +08:00 via iPhone   ❤️ 2
    C#可以满足你列出来的大部分需求,但是 V 站上好像都说国内 C#岗位不多
    vchroc
        14
    vchroc  
    OP
       2022-05-12 13:19:45 +08:00
    @Hanggi 当前 Java 、Go 在开发体验方面都不够完美,所以来看看有什么舒服的实践
    lmshl
        15
    lmshl  
       2022-05-12 13:22:26 +08:00
    Scala / Kotlin +∞
    PureWhiteWu
        16
    PureWhiteWu  
       2022-05-12 13:23:00 +08:00
    Rust
    xiaoriri666
        17
    xiaoriri666  
       2022-05-12 13:40:32 +08:00
    PHP
    Huelse
        18
    Huelse  
       2022-05-12 13:47:54 +08:00   ❤️ 1
    @vchroc #7 你这是 scala fp + graalvm native?
    zsl199512101234
        19
    zsl199512101234  
       2022-05-12 13:49:37 +08:00
    Rust
    securityCoding
        20
    securityCoding  
       2022-05-12 13:51:57 +08:00
    刚从 java 转 go 不管是写 web 还是 rpc 都爽的飞起,再也不见 spring
    kett
        21
    kett  
       2022-05-12 13:54:56 +08:00
    c#除了生态这一条以外都满足你的要求
    vchroc
        22
    vchroc  
    OP
       2022-05-12 13:55:52 +08:00 via iPhone
    @securityCoding 就问一个,策略模式中,新策略的自动注册与发现,怎么解决?
    xjqxz2
        23
    xjqxz2  
       2022-05-12 13:56:19 +08:00
    我觉得 12 楼说的没错,语言不过工具而已,你用的爽,能完成预期任务就够了。你觉得 GO 不行就继续 Java 呗,为什么一定要 GO 走你 Spring 的路呢?
    vchroc
        24
    vchroc  
    OP
       2022-05-12 13:57:32 +08:00 via iPhone
    @xjqxz2 写自己的玩具,想看看市面上有什么好用的工具。不局限 go 或者 JAVA ,这两个都不够完美
    abersheeran
        25
    abersheeran  
       2022-05-12 14:08:48 +08:00
    你这些条件……让我想到了 Rust………………………………………………………………

    这些点都是我写 Rust 的时候流的汗。告辞!
    theohateonion
        26
    theohateonion  
       2022-05-12 14:08:56 +08:00
    @vchroc 找银弹?不存在的。 又想二进制又要抽象程度高,🈚️
    janus77
        27
    janus77  
       2022-05-12 14:09:22 +08:00
    既然你没提速度,那我提名一个 php[狗头]
    jjwjiang
        28
    jjwjiang  
       2022-05-12 14:11:44 +08:00   ❤️ 2
    C#完美满足你除了生态之外的所有需求
    对于开发者的便利 C#说第一应该没人能说第二……
    至于生态,仁者见仁吧,现在基本上该有的都有,社区小是真的,但是也都能用
    pengjay
        29
    pengjay  
       2022-05-12 14:15:39 +08:00
    Go -> PHP
    Kilerd
        30
    Kilerd  
       2022-05-12 14:18:00 +08:00   ❤️ 1
    Bean 自动注册与发现,避免手动维护某个集合

    这种东西即便是 java 里面的 Spring 也是框架帮你做了脏活累活,不可能由语言层面给你提供一个 di 框架的啊。

    先搞清楚自己到底需要什么东西
    lmshl
        31
    lmshl  
       2022-05-12 14:19:02 +08:00   ❤️ 2
    @vchroc
    1 、便捷的异常错误处理;
    Scala 的异常处理是 sound 的,而且是在 Fiber 上,随便几百万个 Fiber 。同时从理论上就能保证资源安全哦
    2 、低开销的抽象成本;
    Scala 有 JIT 替你操心,不用你费神。
    3 、云原生,编译产出物是直接可以运行的二进制文件
    Graalvm native image 以后可以做到这一点,只是目前工具链不够齐全,实践有点坎坷,我有个生产环境的 native image ,打包费了不少时间。
    4 、Bean 自动注册与发现,避免手动维护某个集合
    Scala 有目前最先进的,你放心
    5 、完善的特性支持如泛型、枚举、反射等
    Scala 当之无愧,还支持编译期反射哦,比 Jaba 安全多了。当然你硬要调用运行时反射也不是不可以。
    6 、完善的生态,主要关注 Web 方面
    Scala Web 生态可太丰富了,Akka-HTTP ,http4s ,tapir ,zio-http 。还有更完善的 gRPC / GraphQL 生态
    acehowxx
        32
    acehowxx  
       2022-05-12 14:23:12 +08:00 via Android
    推荐用 rust ,特性多,性能好,错误处理泛型都有,非常适合你。
    liuhan907
        33
    liuhan907  
       2022-05-12 14:28:50 +08:00   ❤️ 1
    只考虑 Web 方面 C#是最好的选择,ASP.NET 一把梭啥都有,.NET6 走起就行了。剩下的就是看需要什么库 NuGet 找找了事。
    securityCoding
        34
    securityCoding  
       2022-05-12 14:31:48 +08:00
    @vchroc 所谓的注册发现无非是 spring 手动帮你做了而已,手动 init ,close 不就好了吗?
    Kamiyu0087
        35
    Kamiyu0087  
       2022-05-12 14:33:38 +08:00
    欢迎使用 Kotlin
    一个字 甜~
    drackzy
        36
    drackzy  
       2022-05-12 14:34:23 +08:00
    Rust 对味,可以作为技术储备起来,难学会的人少,以后不容易卷。比 Go 底层一些、特性多。
    Leviathann
        37
    Leviathann  
       2022-05-12 14:40:19 +08:00
    @lmshl 最近几个月知乎上 scala 活人最多的问题是 《感觉 Scala 越来越凋零了,虽然 Scala 3 已经出来有段时间了,有没有这种感觉》。。。下面大部分都说是的
    vchroc
        38
    vchroc  
    OP
       2022-05-12 14:59:21 +08:00
    @securityCoding 为什么要手动做?实现多了不重不漏本来就是成本,没必要的成本就不要承担了
    vchroc
        39
    vchroc  
    OP
       2022-05-12 15:00:19 +08:00
    @abersheeran RUST 看过,无 GC 对编程体验影响较大
    billlee
        40
    billlee  
       2022-05-12 15:08:52 +08:00
    @lmshl scala 的自动注册有什么推荐方案吗?我现在写 flink 还靠手工 wire
    Hanggi
        41
    Hanggi  
       2022-05-12 15:11:22 +08:00   ❤️ 3
    Rust 什么的绝对不是正解。

    楼主单纯觉得 java 不够好,可能 Kotlin 才是你要的。

    Go 特性少,语法糖太少这件事,你先要清楚这是 Go 语言目前阶段不完善导致的吗?
    明显不是,是 Go 语言就是这么设计的,这么做肯定是经过各种考量,GO 语言今天这么火也说明他的这种设计是有很多受众的。

    语法少说好听点是简单简洁,实际上就是语言设计的妥协。(要知道语言越复杂功能越多,编译越慢这是公认的,不管 C++,Java ,Rust 都有这个问题。)

    过于简单而导致开发不爽这件事,Go 语言其实有他自己的一套解决方法,只不过很多人无法接受,觉得这些功能在语言层面就应该提供。所以说需要一些思想转变。
    acdfjelxe
        42
    acdfjelxe  
       2022-05-12 15:11:46 +08:00
    ?? 语法糖重要吗?那来 cpp 咯
    darksword21
        43
    darksword21  
       2022-05-12 15:15:19 +08:00 via iPhone
    你应该自己设计,他们知道个屁啊,他们懂个皮的编程语言(
    libook
        44
    libook  
       2022-05-12 15:22:28 +08:00
    Go 是面向企业高效生产的,不是面向开发者体验的,两者矛盾的时候,Go 会倾向于选择高效生产。

    找 Web 开发领域工作的话应该绕不开 Java 和 Go ,坚持用些自己觉得“完美”的小众语言,也可能难以找到合适的工作。

    如果不是工作上用,而是自己写着玩,楼上提到的语言都可以看一看,除了 Rust ,Rust 现阶段至少不满足你完整 Web 生态方面的需求,除非你愿意自己造生态。

    换语言和技术栈最好也换一套思维方式,否则不管用啥都觉得不如以前用的那套顺手。
    Goooler
        45
    Goooler  
       2022-05-12 15:26:13 +08:00
    Kotlin + Spring
    cmdOptionKana
        46
    cmdOptionKana  
       2022-05-12 15:27:08 +08:00
    @vchroc Kotlin 啊,完美啊!要语法糖够甜,要生态可无缝调用 Java 。
    HangoX
        47
    HangoX  
       2022-05-12 15:36:13 +08:00
    kotlin ,先进语言该用的都有,无缝调用 java 的库,就是表示有 java 生态,而且还能写 web 和 native
    Leviathann
        48
    Leviathann  
       2022-05-12 15:38:21 +08:00
    @HangoX 没有 pattern matching ,而 java 有
    vchroc
        49
    vchroc  
    OP
       2022-05-12 15:41:10 +08:00
    @Hanggi 过于简单而导致开发不爽这件事,Go 语言其实有他自己的一套解决方法

    展开讲讲?可以的话可以专门开个贴
    vchroc
        50
    vchroc  
    OP
       2022-05-12 15:44:21 +08:00
    @Hanggi 在使用 Go 语言开发的时候,使用代码生成工具,可以解决一部分问题,如相对完善的枚举、注册发现等功能,但味道还是比较苦...
    LeegoYih
        51
    LeegoYih  
       2022-05-12 15:53:44 +08:00
    Ruby
    yazinnnn
        52
    yazinnnn  
       2022-05-12 15:54:29 +08:00
    F#怎么样?
    HangoX
        53
    HangoX  
       2022-05-12 15:54:35 +08:00
    @Leviathann 真要写用 java 写不就好了,本来就能混。kt 有的 java 很多也没有,看自己喜欢用哪个就哪个呗
    Donahue
        54
    Donahue  
       2022-05-12 16:28:34 +08:00
    python
    lysS
        55
    lysS  
       2022-05-12 16:36:11 +08:00
    根据上下文啊,OP 肯定用过满足要求的语言,自己用回去不就行了?
    vchroc
        56
    vchroc  
    OP
       2022-05-12 16:40:39 +08:00
    @HangoX Java 开销大,编译打包后不是二进制可执行文件
    daimiaopeng
        57
    daimiaopeng  
       2022-05-12 16:43:13 +08:00
    要不回来写 c++得了
    lmshl
        58
    lmshl  
       2022-05-12 16:45:04 +08:00
    @Leviathann 那是我们的钓鱼贴,开贴的和回答的都是一个群里的人。我的回答赞数最多哦
    Leviathann
        59
    Leviathann  
       2022-05-12 16:46:00 +08:00
    @lmshl 我上钩了 😂
    lmshl
        60
    lmshl  
       2022-05-12 16:51:21 +08:00   ❤️ 1
    @billlee 那可太多了
    高大上 + 最前沿:distage
    高大上 + 学术范:tagless final ,就是 cats effect 风格的
    高大上 + 容易学:ZIO ,所有环境依赖都在 Layer 中组合起来
    中不溜秋:macwire ,编译期注入,不依赖反射
    手动挡:trait + implicit 注入
    回归传统:guice

    其中群佬们最推荐的是 distage ,我用过剩下的 5 种,2/3/4 风格都是很漂亮简洁的,并且 2/3 是理论完备的资源安全
    lbp0200
        61
    lbp0200  
       2022-05-12 16:58:53 +08:00
    python ?
    cmdOptionKana
        62
    cmdOptionKana  
       2022-05-12 16:59:10 +08:00
    @vchroc

    > Java 开销大,编译打包后不是二进制可执行文件

    你有这个要求,那就更简单了,满足你这个要求的就 C/C++, Go, Rust 等少数几个语言,其中 C++ 在语法层面拥有世界上一切特性,没有的也能用 C++ 自己创造出来。

    如果你说要易学易用,语言特性丰富,开销比 Java 少,可打包成可执行文件,生态也强大的,Python 勉强也算可以。
    ikaros
        63
    ikaros  
       2022-05-12 17:01:49 +08:00
    rust
    FightPig
        64
    FightPig  
       2022-05-12 17:03:27 +08:00   ❤️ 1
    rust ,包你学完退了又学又退又学又退又学
    roundgis
        65
    roundgis  
       2022-05-12 17:23:14 +08:00 via Android
    Php
    yazinnnn
        66
    yazinnnn  
       2022-05-12 17:41:53 +08:00
    你要说开销大我可就不困了

    quarkus 一个简单 http 服务,native 构建,然后 upx 压缩一下,文件大小 12m,内存分配 50m,吞吐仍然有 17000qps

    不用 upx 压缩的话,文件大小 30m,内存分配 30m,吞吐有 6000qps


    Requests per second: 6811.35 [#/sec] (mean)

    426720 8.4 0.0 432448 29256 pts/15 Sl+ 17:36 0:21 ./minimal-1.0.0-SNAPSHOT-runner -Xmx10m

    https://gist.github.com/yazinnnn/47636b5513c1cb10ccb2d455eb29a69e
    unlighted
        67
    unlighted  
       2022-05-12 17:43:25 +08:00
    @FightPig 太贴切了,我已经暂停了,真学不动,折磨
    missdeer
        68
    missdeer  
       2022-05-12 17:52:21 +08:00
    Rust 咯,语法糖又多又香
    serco
        69
    serco  
       2022-05-12 18:18:19 +08:00   ❤️ 1
    Rust 真的是从入门到忘记非常自然。。。其他语言多多少少还能记得一点,这个真的是忘得特别彻底
    bthulu
        70
    bthulu  
       2022-05-12 18:26:05 +08:00
    @yazinnnn 这生成的文件也太大了, 无外部依赖的简单 http 服务, 可执行文件大小无压缩情况下要做到 1M 以下
    panlatent
        71
    panlatent  
       2022-05-12 18:51:06 +08:00   ❤️ 1
    我曾经也有过类似的想法,也研究过大多数主流语言(在不限制领域的情况下,非主流生态肯定是不太行的)。

    最后得出的结论是啥语言合适就老老实实用啥吧,大而全,生态好体验好的语言目前不存在。

    每种语言都能挑出各种毛病 ... 众口难调 .. 不如想想哪几种语言能搞钱,适合自己对未来的规划
    panlatent
        72
    panlatent  
       2022-05-12 18:54:06 +08:00
    有 Java 基础不如选择在 JVM 上的那几个语言,本身 Java 现在生态这么好,适用性这么强,如果只不满足语法的话,干嘛不学它们。
    Mexion
        73
    Mexion  
       2022-05-12 18:58:32 +08:00 via iPhone
    Typescript ,体验极好
    HangoX
        74
    HangoX  
       2022-05-12 19:11:20 +08:00
    @vchroc 我说的是 kotlin ,kotlin 可以编译为 native 二进制文件
    java 也是可以编译为二进制文件,可以看看 springnative
    java 开销并不大,是 javaweb 开销大
    ojh
        75
    ojh  
       2022-05-12 19:19:35 +08:00   ❤️ 1
    @vchroc 楼上不是说了 Graalvm 、Spring Native 、Quarkus 这些技术帮你把 Java 变二进制可执行文件了么
    securityCoding
        76
    securityCoding  
       2022-05-12 19:26:50 +08:00
    @vchroc 你是个杠精?
    INCerry
        77
    INCerry  
       2022-05-12 19:58:51 +08:00   ❤️ 1
    C# 呀
    cocong
        78
    cocong  
       2022-05-12 21:07:03 +08:00
    PHP 你值得拥有,但就是因为太好用,门槛低,工资就低了。所以我要转 go 。
    vchroc
        79
    vchroc  
    OP
       2022-05-12 21:25:59 +08:00
    @securityCoding 不好意思,措辞可能差了些,让你误会了。真实意思是,DRY ,不想写重复的代码
    vchroc
        80
    vchroc  
    OP
       2022-05-12 21:30:38 +08:00
    @ojh 了解,但是当前的 native 技术还不成熟
    codefun666
        81
    codefun666  
       2022-05-12 22:43:20 +08:00
    学好 C 语言,走遍天下都不怕。效率、灵活性无人能敌!
    richardwong
        82
    richardwong  
       2022-05-12 23:19:53 +08:00
    java
    weiwen
        83
    weiwen  
       2022-05-13 01:06:47 +08:00
    Scala, 你值得拥有。
    yi0322
        84
    yi0322  
       2022-05-13 01:21:13 +08:00   ❤️ 1
    optimized for programmer happiness
    SMGdcAt4kPPQ
        85
    SMGdcAt4kPPQ  
       2022-05-13 01:52:39 +08:00 via Android   ❤️ 2
    C#在异步和 ORM 上的生态比 Java 好
    cgpiao
        86
    cgpiao  
       2022-05-13 07:50:45 +08:00   ❤️ 1
    elixir 欢迎你
    bthulu
        87
    bthulu  
       2022-05-13 07:59:28 +08:00
    @ComputerIdiot C#依赖注入不够看呀, 功能太简陋了
    jeffw
        88
    jeffw  
       2022-05-13 08:12:53 +08:00   ❤️ 2
    C#吧,生态够用,熟练之后开发效率非常高,而且现在也跨平台了
    yazinnnn
        89
    yazinnnn  
       2022-05-13 08:33:25 +08:00
    这不行,那不行,找个厂子拧螺丝去吧
    SMGdcAt4kPPQ
        90
    SMGdcAt4kPPQ  
       2022-05-13 08:34:12 +08:00 via Android
    @bthulu 试试 Autofac ?
    bthulu
        91
    bthulu  
       2022-05-13 08:55:19 +08:00
    @ComputerIdiot 多嘴再问一句, C#里有没有什么办法能实现定时任务呢? 就是任务完成后, 隔 2 秒后开始执行下一次任务, 不是每隔 2 秒执行一次.
    C#自带的定时器只能实现每 2 秒执行一次. 我现在用的 BackgroundService, 在 ExecuteAsync 方法里 await2 秒钟, 再在 Program.cs 里 AddSingleton<IHostedService>(...)注入进去.
    但是现在碰到的问题是, 需要在前端页面上激活一个新任务, 停止一个旧任务. 那就不能在 Program.cs 里注入了, 因为你根本不知道前端会激活哪个任务.
    如果是 java 的话, 调用自带线程池的 ScheduleAtFixedDelay 就行了, C#我愣是想不出.
    还有, 有一系列的策略类, 需要将策略类的配置项注册到配置中心, 然后在前端启用一个策略时就 new 一个策略实例, 前端未启用时是不用 new 的. 那这个注册方法写到哪里去呢? 本着解耦的原则, 应该就写在策略类自身静态代码块里. 但 C#比较尴尬的是, 静态代码块只有在类实例化或有静态属性被调用时才会执行. 导致根本就不会执行注册代码块. 而注册代码块不执行, 那注册中心根本就不知道有这么个策略类, 前端页面也就不会显示这个策略类, 也就是根本不会实例化. 要么就只能在注册中心里手动注册. 那这样增加一个策略类时, 还必须修改注册中心的代码. 如果能像 java 那样扫描包下的类加载一下就自动调用静态代码块就好了.
    securityCoding
        92
    securityCoding  
       2022-05-13 09:22:51 +08:00
    @vchroc 老哥,依赖注入并非是个必须的东西,微服务拆分合理根本就不会有巨型应用。策略模式自己搞个 map 存储一下实例也就分分钟,很多东西没有那么复杂只是在 java 体系会实现的非常晦涩,不要被 spring 带偏了。
    chrisia
        93
    chrisia  
       2022-05-13 09:23:25 +08:00
    kotlin
    SMGdcAt4kPPQ
        94
    SMGdcAt4kPPQ  
       2022-05-13 09:27:34 +08:00
    @bthulu 后面这个问题用 RunClassConstructor
    angryfish
        95
    angryfish  
       2022-05-13 09:30:21 +08:00
    耐心一点,这些 go 以后都会加上。
    而且,为啥不直接用 java 呢?
    lysS
        96
    lysS  
       2022-05-13 09:34:43 +08:00
    @angryfish 可别加上。。。。
    whyso
        97
    whyso  
       2022-05-13 09:35:06 +08:00
    @bthulu 不了解 Java,C#,Go 有 time.AfterFunc(),(非杠)
    vchroc
        98
    vchroc  
    OP
       2022-05-13 09:36:45 +08:00 via iPhone
    @securityCoding 我的意思是 其实有很多可以避免手动维护的东西,比如遍历枚举,难道定义完枚举还要,手动复制一份到集合遍历吗?后面新增修改都要维护,这份工作容易遗漏且没有意义。同理策略的注册也是一样,本质是不要写重复的东西,或者重复的东西自动化,这才是 coder 要关注的
    lysS
        99
    lysS  
       2022-05-13 09:57:26 +08:00
    @cmdOptionKana python 那打包。。。那 electron 也算对 js 的打包
    SMGdcAt4kPPQ
        100
    SMGdcAt4kPPQ  
       2022-05-13 10:05:49 +08:00 via Android
    @bthulu 前面这个问题可以看看
    《 A simple Recurring Task using C# and .NET 》
    1  2  
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4055 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 50ms · UTC 05:24 · PVG 13:24 · LAX 21:24 · JFK 00:24
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.