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

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

  •  
  •   vchroc · 12 天前 via iPhone · 11776 次点击

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

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

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

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

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

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

    先搞清楚自己到底需要什么东西
    lmshl
        31
    lmshl  
       12 天前   ❤️ 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  
       12 天前 via Android
    推荐用 rust ,特性多,性能好,错误处理泛型都有,非常适合你。
    liuhan907
        33
    liuhan907  
       12 天前   ❤️ 1
    只考虑 Web 方面 C#是最好的选择,ASP.NET 一把梭啥都有,.NET6 走起就行了。剩下的就是看需要什么库 NuGet 找找了事。
    securityCoding
        34
    securityCoding  
       12 天前
    @vchroc 所谓的注册发现无非是 spring 手动帮你做了而已,手动 init ,close 不就好了吗?
    Kamiyu0087
        35
    Kamiyu0087  
       12 天前
    欢迎使用 Kotlin
    一个字 甜~
    drackzy
        36
    drackzy  
       12 天前
    Rust 对味,可以作为技术储备起来,难学会的人少,以后不容易卷。比 Go 底层一些、特性多。
    Leviathann
        37
    Leviathann  
       12 天前
    @lmshl 最近几个月知乎上 scala 活人最多的问题是 《感觉 Scala 越来越凋零了,虽然 Scala 3 已经出来有段时间了,有没有这种感觉》。。。下面大部分都说是的
    vchroc
        38
    vchroc  
    OP
       12 天前
    @securityCoding 为什么要手动做?实现多了不重不漏本来就是成本,没必要的成本就不要承担了
    vchroc
        39
    vchroc  
    OP
       12 天前
    @abersheeran RUST 看过,无 GC 对编程体验影响较大
    billlee
        40
    billlee  
       12 天前
    @lmshl scala 的自动注册有什么推荐方案吗?我现在写 flink 还靠手工 wire
    Hanggi
        41
    Hanggi  
       12 天前   ❤️ 3
    Rust 什么的绝对不是正解。

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

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

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

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

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

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

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

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

    其中群佬们最推荐的是 distage ,我用过剩下的 5 种,2/3/4 风格都是很漂亮简洁的,并且 2/3 是理论完备的资源安全
    lbp0200
        61
    lbp0200  
       12 天前
    python ?
    cmdOptionKana
        62
    cmdOptionKana  
       12 天前
    @vchroc

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

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

    如果你说要易学易用,语言特性丰富,开销比 Java 少,可打包成可执行文件,生态也强大的,Python 勉强也算可以。
    ikaros
        63
    ikaros  
       12 天前
    rust
    FightPig
        64
    FightPig  
       12 天前   ❤️ 1
    rust ,包你学完退了又学又退又学又退又学
    roundgis
        65
    roundgis  
       12 天前 via Android
    Php
    yazinnnn
        66
    yazinnnn  
       12 天前
    你要说开销大我可就不困了

    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

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

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

    每种语言都能挑出各种毛病 ... 众口难调 .. 不如想想哪几种语言能搞钱,适合自己对未来的规划
    panlatent
        72
    panlatent  
       12 天前
    有 Java 基础不如选择在 JVM 上的那几个语言,本身 Java 现在生态这么好,适用性这么强,如果只不满足语法的话,干嘛不学它们。
    Mexion
        73
    Mexion  
       12 天前 via iPhone
    Typescript ,体验极好
    HangoX
        74
    HangoX  
       12 天前
    @vchroc 我说的是 kotlin ,kotlin 可以编译为 native 二进制文件
    java 也是可以编译为二进制文件,可以看看 springnative
    java 开销并不大,是 javaweb 开销大
    ojh
        75
    ojh  
       12 天前   ❤️ 1
    @vchroc 楼上不是说了 Graalvm 、Spring Native 、Quarkus 这些技术帮你把 Java 变二进制可执行文件了么
    securityCoding
        76
    securityCoding  
       12 天前
    @vchroc 你是个杠精?
    INCerry
        77
    INCerry  
       12 天前   ❤️ 1
    C# 呀
    cocong
        78
    cocong  
       11 天前
    PHP 你值得拥有,但就是因为太好用,门槛低,工资就低了。所以我要转 go 。
    vchroc
        79
    vchroc  
    OP
       11 天前
    @securityCoding 不好意思,措辞可能差了些,让你误会了。真实意思是,DRY ,不想写重复的代码
    vchroc
        80
    vchroc  
    OP
       11 天前
    @ojh 了解,但是当前的 native 技术还不成熟
    codefun666
        81
    codefun666  
       11 天前
    学好 C 语言,走遍天下都不怕。效率、灵活性无人能敌!
    richardwong
        82
    richardwong  
       11 天前
    java
    weiwen
        83
    weiwen  
       11 天前
    Scala, 你值得拥有。
    yi0322
        84
    yi0322  
       11 天前   ❤️ 1
    optimized for programmer happiness
    ComputerIdiot
        85
    ComputerIdiot  
       11 天前 via Android   ❤️ 2
    C#在异步和 ORM 上的生态比 Java 好
    cgpiao
        86
    cgpiao  
       11 天前   ❤️ 1
    elixir 欢迎你
    bthulu
        87
    bthulu  
       11 天前
    @ComputerIdiot C#依赖注入不够看呀, 功能太简陋了
    jeffw
        88
    jeffw  
       11 天前   ❤️ 2
    C#吧,生态够用,熟练之后开发效率非常高,而且现在也跨平台了
    yazinnnn
        89
    yazinnnn  
       11 天前
    这不行,那不行,找个厂子拧螺丝去吧
    ComputerIdiot
        90
    ComputerIdiot  
       11 天前 via Android
    @bthulu 试试 Autofac ?
    bthulu
        91
    bthulu  
       11 天前
    @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  
       11 天前
    @vchroc 老哥,依赖注入并非是个必须的东西,微服务拆分合理根本就不会有巨型应用。策略模式自己搞个 map 存储一下实例也就分分钟,很多东西没有那么复杂只是在 java 体系会实现的非常晦涩,不要被 spring 带偏了。
    chrisia
        93
    chrisia  
       11 天前
    kotlin
    ComputerIdiot
        94
    ComputerIdiot  
       11 天前
    @bthulu 后面这个问题用 RunClassConstructor
    angryfish
        95
    angryfish  
       11 天前
    耐心一点,这些 go 以后都会加上。
    而且,为啥不直接用 java 呢?
    lysS
        96
    lysS  
       11 天前
    @angryfish 可别加上。。。。
    whyso
        97
    whyso  
       11 天前
    @bthulu 不了解 Java,C#,Go 有 time.AfterFunc(),(非杠)
    vchroc
        98
    vchroc  
    OP
       11 天前 via iPhone
    @securityCoding 我的意思是 其实有很多可以避免手动维护的东西,比如遍历枚举,难道定义完枚举还要,手动复制一份到集合遍历吗?后面新增修改都要维护,这份工作容易遗漏且没有意义。同理策略的注册也是一样,本质是不要写重复的东西,或者重复的东西自动化,这才是 coder 要关注的
    lysS
        99
    lysS  
       11 天前
    @cmdOptionKana python 那打包。。。那 electron 也算对 js 的打包
    ComputerIdiot
        100
    ComputerIdiot  
       11 天前 via Android
    @bthulu 前面这个问题可以看看
    《 A simple Recurring Task using C# and .NET 》
    1  2  
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2874 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 12:21 · PVG 20:21 · LAX 05:21 · JFK 08:21
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.