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

golang, 开发效率低执行效率高的语言?

  •  1
     
  •   iintothewind · 2 天前 · 13909 次点击

    最近因为偶然的原因, 不得不用了一段时间的 go. 经过这一段时间的使用, 发现这门语言实在是有太多不爽的地方, 所以就在这里吐槽一下, 看看是不是因为我理解不对, 还是这就是 go 语言以及生态的缺陷.

    语法表达力非常差

    go 的控制流非常简单: for, if, else, switch and defer 就是全部了 当然, 你如果之前对计算机语言所有的认知都来自于命令范式的语言(比如 C), 这并没有什么, 甚至觉得够用了.

    但是对于偏函数式风格的语言, 这简直太简陋了, 函数式的控制流不仅有 for, if-else, 对于 switch 来说有更加强大的 pattern-match, 对于 defer 这种玩意, 有更好 try-catch-finally 替代, 而且你想怎么写就怎么写. 而且支持 unit, filter, map, flatMap 等等统一的操作.

    golang 控制流的简陋直接造成了 golang 的语法表达能力差. 解决同样的问题, 需要更多更长的代码, 就像当年不支持 Lambda 特性的 Java 一样.

    我就奇怪了: Java 没有支持 Lambda 以前, 人人骂 Java 代码啰嗦, 写起来累人, 到了 golang 了这么差的语法表达力, 怎么就成了简单清爽?

    简陋敷衍的容错处理(Error Handling)

    我接触到其它语言在写后端业务逻辑是, 对于 public 方法的入参是采取完全不信任的态度的. 原因很简单, 传进来的值在运行时存在非常多的可能, 最典型的就是 null 值一定要处理. 如果存在 a.b.c.d 等这样取值方式, 恐怕要不得不采用 Option 一层层去拿. 我可以理解有人说 Option 麻烦, 不管你用什么方式, 至少判空的逻辑是少不了的.

    但是, Golang 是没有 Option 和 Try 的, golang 甚至连三元表达式都没有, 所以一般 Golang 是这样做的:

    if a == nil { return nil, someError("...") }

    b, err := a.b

    if(err != nil) { return nil, someError("...") }

    后面一大长串的 if(err != nil).......

    如果你天天是写这样的代码, 你觉得这叫简洁?

    少到寒酸的集合类型以及集合操作

    其实 golang 的集合就只有个 array 和 map.

    还有人说 array 的 slice 支持操作很方便啊? 我劝你醒醒, 看看其它语言吧, 就这几个操作哪个语言不支持啊?

    Go 默认集合类型就是可变的, 所以所有对集合的操作, 实际上是修改集合自身. Go 是没有不可变集合这个概念的.

    嗯, 找了找居然有人写了类似于 Linq 的 go-linq, 但是你看看相同的操作, go 得写多少代码吧, 而且每个操作结束时输出的变量居然时实现声明好再传进去的, 连直接输出到一个不可变集合的能力都没有.

    蛋疼的数据库处理

    其实我认为 Java 的数据库处理已经够老旧了. JDBC 标准已经很久没更新了, 而且很可能也不再更新了, 之前很多人期待的原生异步处理能力很可能不会再有了. Java 比较流行的 ORM 框架, hibernate 和 MyBatis 也已经非常老了, 老到都没办法在多线程环境下正常运行, 因为 Context 默认是单线程环境的. 但就这么老的 ORM 框架, 或许没办法跟.Net 的 linq 处理效率比一比, 但跟 Go 比起来也是好太多了.

    来来来, Go 现在访问数据库, 有好的 ORM 框架吗? 有一个 sqlc 代码生成器, 大家已经觉得好太多了, 比自己写实在是快多了, 怎么不骂 Go 的数据库处理低效了, 就这??? 连个像样的 ORM 框架都没有.

    鸡肋的泛型系统

    Go 有泛型, 但又不支持方法级别的泛型.

    Go 也没有泛型型变的概念.

    所以你在接口上做一定程度的抽象, 绑定更多操作, 生成新的类型的实例是做不到的.

    总结

    Golang 其实真的只是一个 Better C 的定位, 当然这还是在开发效率上来说的, 就是仅仅** Better-Than-C **. 但 Golang 这简陋的语法, 相对于其它非常多的现代语言来讲, 还是差的很多的.

    可能 Go 语言的那几个掌舵人就是典型的命令范式计算机语言的拥趸, "嗯, 我们可绝不会加入任何函数式的特性, 这会增加这个语言的复杂度, 降低编译速度, 让语言不纯粹...."

    您说您的, 但是 Go 写写底层就好了, 毕竟比 C 好. C 可是连数据类型概念都没有, 从来只操作内存的.

    现在结构体都允许写接收方法了, 也能写点泛型了, 内存都帮你回收了, 你还想怎样?

    什么? 你说用 Go 写业务逻辑很痛苦???

    谁让你用 Go 写业务逻辑了, 跟你说了别去跟那帮写 Java 的混一起, 他们就只会 spring, 除了 spring 啥都不会.

    164 条回复    2025-01-04 20:46:56 +08:00
    1  2  
    zhaoahui
        1
    zhaoahui  
       2 天前
    gorm
    javalaw2010
        2
    javalaw2010  
       2 天前   ❤️ 41
    确实,go 语言问题不少。不过流行的语言几乎都有各自的问题:java/kotlin/python/js/php/C 族/rust, 哪个没被拉出来掉在城门楼上鞭尸过?也有的语言确实看起来各个方面都很不错,缺点嘛就是没人用。

    我曾经也想找一门各方面都完美的语言,集各家编程语言之大成,从前端到后端,从 20 块的嵌入式硬件到几千亿美元的空间站,给广大开发者带来无与伦比的开发体验。结果就是陷在语言选择的囹圄里不能自拔,日月蹉跎。

    现在想明白了,如果你有技术栈选择权,你就选自己最顺手的语言,你自己的项目,你就爱怎么写就怎么写,大兵团作战,你就多点几下鼠标键盘,把类型提示和目录分层做好;如果你没有技术栈选择权,就老老实实在屎山上拉屎。早点干完活早点回家陪家人,人生苦短,不必在赛博搬砖上浪费人生大好的时光。
    lbp0200
        3
    lbp0200  
       2 天前
    java 不都是 jsp 吗?需要写非常多的 XML 才是正统啊,spring 是啥?一定是邪教。
    iintothewind
        4
    iintothewind  
    OP
       2 天前
    @lbp0200 #3 其实在大部分 Non-Java Developer 眼中, 大概率 java 约等于 spring
    iintothewind
        5
    iintothewind  
    OP
       2 天前
    @javalaw2010 #2 对, 我这阵子用 Go 也是没得选, 只能硬着头皮用, 所以才很想吐槽, 唉....
    INCerry
        6
    INCerry  
       2 天前
    似乎执行效率也不高?看各种 benchmark 的结果,go 并不占优势
    iyaozhen
        7
    iyaozhen  
       2 天前   ❤️ 21
    “语法表达力非常差”这是 feature ,不是 bug ,就是这样设计的,语法糖很少,别人也没说他是函数式编程呀
    “人人骂 Java 代码啰嗦, 写起来累人” 骂 java 啰嗦是说面向对象那一套吧,和 Lambda 关系不大
    代码并不是越短越好,是越清晰越好。这方面 Lambda 被人诟病很多,特别是 python 还只能写一行,别人根本看不清(当然 ide 可以展开)

    “Error Handling”这个是老生常谈的问题,golang 这样确实不是最优解,但不代表 try catch 就是最佳实践

    “少到寒酸的集合类型以及集合操作” 同第一点,故意设计的

    ORM 框架 可以看看 gorm 和其新的 gen

    泛型别人 Google 本来也不想做,这不是你们逼的嘛

    其实 Go 最大的问题是 Google 一家之言,不接受社区建议。说到底这就是别人自己的语言,他们好用,开源出来而已。
    Go 不是不适合写业务,是不适合和 java 比较。你之前用 java 的,用 go 怎么都别扭。go 当然也想和 java 争一下 web 的市场,但被干掉的反而是 php 、node 、python 这些 web 的市场(注意我说的是 web 市场
    我之前写 php web 的,我觉得 go 比 php 好很多,性能和工程

    2 楼其实说的在理。我个人认为你选语言就像相亲一样,要多看看别人优点,以及最不能忍受的缺点。go 在性能这一块就是好一点,适合微服务部署(当然 java 在一些 jvm 改造后也行,但先入为主的观念很重要)
    iyaozhen
        8
    iyaozhen  
       2 天前   ❤️ 1
    @iintothewind #5 当然,你没得选就另说了。只能多看看优点吧 毕竟马云让我吃屎,我也能吃穷他
    lasuar
        9
    lasuar  
       2 天前   ❤️ 1
    标准库对于业务来说支持的方法是挺简陋的,现在要需要引入三方库,好在生态已经逐渐完善,有很多库可用。go 对于 java 的优势应该主要是原生协程、编译型语言。也确实没有一个特别好用的 orm 库(现在的 goframe 的 orm 组件还行 >> gorm )。怎么说,要一个开发效率与性能齐驱的语言,目前还是没看到的。
    对于 Java ,个人很讨厌其语法上的臃肿。
    adoal
        10
    adoal  
       2 天前
    “有更好 try-catch-finally 替代”真的是在说函数式的控制流吗?陈鲁豫不相信。
    lasuar
        11
    lasuar  
       2 天前
    rust 其实能够做到开发效率与性能齐驱,无奈上手成本过高,只能覆盖小众方向。
    iintothewind
        12
    iintothewind  
    OP
       2 天前
    @adoal #10 不管是啥比 if err != nil 都要好太多了, 看到 if err != nil 都烦的头皮发麻.
    realpg
        13
    realpg  
       2 天前   ❤️ 2
    习惯哪种语言的先入为主的逻辑,就找哪种语言的工作
    iintothewind
        14
    iintothewind  
    OP
       2 天前
    @lasuar #9 其实现在的 java 相对于 go 来说 语法上可是灵活太多了.

    要是 lambda 特性以前的 java, 确实跟 go 一样, 属于语法表达力极差, 又长又臭,
    所以才有了 groovy, scala, kotlin 这些方言.
    nomagick
        15
    nomagick  
       2 天前
    ziglang 解君愁
    iintothewind
        16
    iintothewind  
    OP
       2 天前
    @lasuar #11 有空可以尝试一下, 我不嫌语言学的多.
    xgdgsc
        17
    xgdgsc  
       2 天前 via Android
    试试 Julia
    hefish
        18
    hefish  
       2 天前
    这是水论文那?
    helone
        19
    helone  
       2 天前   ❤️ 8
    其实语法表达力非常差反而是好事,尤其是大兵团作战,一眼就能看出来别人要干嘛,如果换语法糖多的语言,一层一层封装,再加几个魔法,接手可能看到代码脑袋都大了
    gam2046
        20
    gam2046  
       2 天前
    唔,个人以为,Golang 是类型安全的 C ,仅此而已。

    Go 的编写负担会比 C 低很多,同时也还有不错的执行效率。

    但是和其他高级语言比,语法上几乎没什么优越性,在不使用 CGO 的情况下,能够非常方便的跨平台编译,勉强能算一个。
    dayeye2006199
        21
    dayeye2006199  
       2 天前
    其实还行。心智负担很小,因为就那么几个语言特性,搞明白了就搞明白了。
    iintothewind
        22
    iintothewind  
    OP
       2 天前
    @gam2046 #20 但是如果从别的拥有更高语法表达力的"现代语言"转过来时, 写复杂逻辑就有一个非常大的落差, 我就经常想, 我靠, 就这点功能, 我要是用 XX 早就几行解决了, 结果 go 这里就只能先这样, 在这样, 在这样, 局部变量一大堆, 内部状态改来改去, 心智负担其实更大.
    lasuar
        23
    lasuar  
       2 天前
    @iintothewind rust 我早已学完了。。但想要在项目中采用,还得考虑其他成员的技术 lv 和负担,我无法要求身边的人都跟我一样花费足够多的时间去学习一门系统语言,然后用来写 web 业务。
    wwhontheway
        24
    wwhontheway  
       2 天前
    其实一直不太理解 if err != nil 到底有什么问题?
    helone
        25
    helone  
       2 天前
    @wwhontheway 有强迫症或者语言洁癖的可能受不了
    importmeta
        26
    importmeta  
       2 天前   ❤️ 6
    服务器用 Go 最省钱, 举个例子,一个后台用 Go 写 6MB, Node 60MB, Java 300MB.
    GooMS
        27
    GooMS  
       2 天前
    觉得 err 挺好的,有问题就介入
    EscYezi
        28
    EscYezi  
       2 天前 via Android
    关于错误处理,我认为 go 最大的问题是 error 作为返回值可以不做任何处理继续向下执行,这可能会导致预期外的错误,而且很难排查。哪怕是 java 至少也得手动 catch 一下。
    虽然有 linter 能缓解这个问题,但是总感觉很不安全
    mogging
        29
    mogging  
       2 天前 via Android
    go 在 devops 工具开发这个领域没什么对手
    lloovve
        30
    lloovve  
       2 天前 via iPhone
    那可以学 Rust ,本身主用 c ,过度到 golang 写网络相关的服务,还挺爽的
    Ayanokouji
        31
    Ayanokouji  
       2 天前
    @wwhontheway #24 ,if err != nil 最大的问题是这个 err 怎么处理。web 业务通常情况下的逻辑就是一层层往上返回,如果出问题如何进行排查,这里很考验对 err 的处理策略,心智负担还是挺大的。
    rekulas
        32
    rekulas  
       2 天前   ❤️ 2
    骂的很对 但我最喜欢的还是 go , 它的优点完美实现了我的需求这就够了,至于缺点,哪个语言没有呢
    wysnxzm
        33
    wysnxzm  
       2 天前
    不好的就是 feature 是故意这样设计,是你们逼的
    好的也是 feature 是故意这样设计,但跟你们无关
    kele999
        34
    kele999  
       2 天前
    太对了,我希望有三元操作符
    xingjue
        35
    xingjue  
       2 天前   ❤️ 1
    java 回去玩 java 喜欢又臭又长的裹脚布的 一辈子也改不了
    cccvno1
        36
    cccvno1  
       2 天前
    味道太冲了
    xiuming
        37
    xiuming  
       2 天前   ❤️ 3
    go 造它有它的使命,肯定不是为了满足你的要求而设计的。你们技术选型出现问题怪不到语言身上。Google 公司认为它就应该是这样的,就这样没有什么其他原因。Google 没有义务造你想要的,它也不会追求和别语言一样设计,能理解就理解 理解不了也没办法。
    tairan2006
        38
    tairan2006  
       2 天前
    开发效率其实还好…语法确实很简陋,但是方便理解,有利有弊吧。

    增删改查就用 sql builder 直接写啊,orm 这种东西有没有无所谓的。
    iintothewind
        39
    iintothewind  
    OP
       2 天前
    @xingjue #35 我又不是只用一种语言, java, go, c sharp, javascript, typescript, python, scala, haskell, scheme 都用过.
    再说了 你说 java 又臭又长可不对啊, java 现在的版本比 go 语法特性可多多了, 相比之下也只能说 golang 代码 "又臭又长" 啊.
    sunny352787
        40
    sunny352787  
       2 天前   ❤️ 1
    @kele999 AI 教我 golang 的三元运算这么写:result := map[bool]any{true: "true", false: "false"}[true]

    又不是不能用.jpg
    mxT52CRuqR6o5
        41
    mxT52CRuqR6o5  
       2 天前
    别问,问就是大道至简
    chandlerbing9317
        42
    chandlerbing9317  
       2 天前   ❤️ 1
    golang 就是屎味的巧克力,它的 native 、并发、内存占用低、交叉编译等都是巧克力。但你想吃这个巧克力,就得忍受它语法简陋和各个奇怪的设计(如 if err 、2006-01-02 15:04:05 等)的屎,我用 golang 一般都是一边捏着鼻子一边写的。
    vultr
        43
    vultr  
       2 天前
    可以看看这样的写法是不是适合用 go 写业务。

    https://gostartkit.com/docs/golang/example/article-ce/definition/

    只要把类设计好,restful api ,文档,图表 都准备好了。
    PiersSoCool
        44
    PiersSoCool  
       2 天前   ❤️ 9
    等看别人的代码就知道 golang 多香了
    pkoukk
        45
    pkoukk  
       2 天前
    我个人工作以来写过 c#,python,一小段 java,node js,ts,现在在写 go
    世界上没有完美的语言,用的多了就明白很多东西就是 trade off ,没有啥是无缘无故天上掉下来的
    但是 javaer 特别喜欢攻击别的语言,也许是因为在接受了臃肿冗长的写法之后,不觉得这是语言里的问题吧
    mengzhuo
        46
    mengzhuo  
       2 天前   ❤️ 4
    Go 是门处处透着中庸的工程语言。

    其实执行效率也不算太高,但够用了。
    工程语言的要求就是简单易懂,任何人都方便读,花里胡哨的语法和符号会导致人类大脑无法处理。
    linuxsuren
        47
    linuxsuren  
       2 天前
    https://github.com/LinuxSuRen/api-testing 自我感觉 go 代码还是比较优雅的
    lnbiuc
        48
    lnbiuc  
       2 天前
    同样的话,在 ts 和 java 上同样适用
    iintothewind
        49
    iintothewind  
    OP
       2 天前
    @pkoukk #45 我也不只用一种语言.

    但 Java 来说其实相对 go 并不冗长吧.
    Java 只是历史原因, 带着镣铐跳舞罢了,

    语法设计那肯定还是不如 C#更合理的.
    njutree
        50
    njutree  
       2 天前
    Go 确实有这样或那样的问题,比如很多设计不太高效和优雅,if err != nil 太简单粗暴。但是越来越多的国内大公司全面接受 Go 我觉得也是有原因的,首先性能还不错据说字节从 python 切换到 GO 服务器省了很多,大多数语法都很简单,没有太多坑(隐式约定)上手快。很多时候优雅都是隐式约定带来的,隐式约定和设计东西越多,上手需要花的时间越多。
    liaohongxing
        51
    liaohongxing  
       2 天前
    if err 配合 oops 库, 2006-01-02 15:04:05 配合 carbon gorm ,问题不大太,java 过来的肯定不适应 ,就像 go 搞长了去搞 java 不适应,又长又臭一样。
    dacapoday
        52
    dacapoday  
       2 天前   ❤️ 4
    2025 年还有这样的新人入坑贴,golang 的生态非常活跃。
    liaohongxing
        53
    liaohongxing  
       2 天前
    还有 集合类型以及集合操作 我都是自己写的结构体库,也蛮方便的
    GeekGao
        54
    GeekGao  
       2 天前
    月经贴
    ninjashixuan
        55
    ninjashixuan  
       2 天前   ❤️ 1
    天天有人批斗,但 TIOBE 等榜单一直稳步上升,奇怪了都是谁在用,滑稽.jpg 。
    pkoukk
        56
    pkoukk  
       2 天前   ❤️ 1
    @kele999 敢给我三元,我就敢写 result:=FuncA(FuncA1(v1,v2)?v3:v4)?FuncB(v5?FuncB1():FuncB2()):FuncC()。
    所以吧,还是别给三元了
    lysShub
        57
    lysShub  
       2 天前
    @EscYezi 谁叫你忽略 err 的(虽然我也干过这种事情 [捂脸] )
    december
        58
    december  
       2 天前
    @pkoukk 三元的写法太 fuck 了。
    minami
        59
    minami  
       2 天前   ❤️ 4
    日经问题看多了,我只能说写 java 出身的就别搁着评价 go 了,go 就是一帮写 c 语言的搞出来的云原生时代的 better C ,虽然有很多缺点但是是实实在在的解决了他们最关心的几个痛点,你们在乎的恰恰是他们不太在乎的
    minami
        60
    minami  
       2 天前
    @wwhontheway 也就 java 仔天天黑,写 C 出身的都看习惯了
    nmap
        61
    nmap  
       2 天前   ❤️ 1
    敌人骂就说明我们做对了
    ChrisFreeMan
        62
    ChrisFreeMan  
       2 天前
    我在等龙卷
    iintothewind
        63
    iintothewind  
    OP
       2 天前
    @minami #59 golang = better C, 太对了.

    可是写 Java 的也不是只写 Java 啊, 难道写 C 的只写 C 吗?
    iintothewind
        64
    iintothewind  
    OP
       2 天前
    @pkoukk 你这…..
    语法特性不支持,跟你故意不好好用这个语法特性这是两个概念吧。
    if-else 也可以无限嵌套,把 if-else 也不支持算了?
    wkong
        65
    wkong  
       2 天前
    反正写出来都是屎山,还在乎是什么味道的吗 😂
    minami
        66
    minami  
       2 天前
    @iintothewind #62 写 C 的不会挑三拣四的,你知道 go 一下子解决了 C 的多少个历史痛点吗
    chen11
        67
    chen11  
       2 天前
    go 的错误处理机制确实蛋疼,垃圾,傻逼。
    niubiman
        68
    niubiman  
       2 天前
    go 写起来有一种便秘的感觉
    roundgis
        69
    roundgis  
       2 天前 via Android
    當年銀行那堆中間件也是用 c 堆出來的

    換成 golang 也不會更差

    錢到位就行。

    編程語言講真

    只有

    天天被人罵但是還是要捏著鼻子用

    沒人用

    這兩種
    lancelock
        70
    lancelock  
       2 天前   ❤️ 3
    语法和性能的平衡就是 c#
    tyrantZhao
        71
    tyrantZhao  
       2 天前   ❤️ 1
    不要用 java 的思维思考 go 。
    lyxxxh2
        72
    lyxxxh2  
       2 天前   ❤️ 1
    https://i.mij.rip/2025/01/02/abf66106b127a219c812dc972f35aa96.png
    开发确实慢,之前我还在吐槽 go 。
    我写个 http 请求都很痛苦,何况其他的
    1. 先定义一堆结构体,返回又定义一堆结构体。 (很怀念脚本语言,不用写这么多废话)
    2. 常用的语法糖都没有,我很喜欢用语法糖,几行代码搞定数据的结构。 而 go 非得自己 if for func ...
    3. 库少,digest 找半天,找不到有用的,好不容易找到 resty ,又有 bug 。
    /**
    golang 没官方的 digest auth 支持 因此封装 http 客户端 废话吐槽:还没见过 http 客户端不支持 digest auth 的 让我开眼界了
    digest auth 文章来源: https://stackoverflow.com/questions/39474284/how-do-you-do-a-http-post-with-digest-authentication-in-golang
    resty 有 digest auth 但是 post put 都有 bug: net/http: HTTP/1.x transport connection broken: http: ContentLength=27 with Body length 0
    这个代码很差 后面再优化了
    */
    https://github.com/go-resty/resty/issues/729
    这个的 bug 和我一样,我也是用海康的 isapi 。

    php 十几秒钟的事情,我得几分钟才搞好。
    虽然这些定义的代码在后续 ida 提示很好,对我来说就是冗余代码,增加心智负担。
    因为项目原因,我只能选 go
    1. 运行在客户端的,而 go 可以直接生成二进制,不用考虑加密。
    2. 不依赖环境,运行方便
    3. 性能,才 17mb,还是用来 beego 框架,cpu 基本是 0%
    ZeroDu
        73
    ZeroDu  
       2 天前
    最近也在看,op 说的这几点非常赞同。骂 java 的我只能说可能还停留在 1.8 以前时代
    ZeroDu
        74
    ZeroDu  
       2 天前
    @ZeroDu #72 golang 优势可能就是协程和可以直接编译成二进制可执行文件
    fregie
        75
    fregie  
       2 天前   ❤️ 4
    如果你只是一个写代码的,你可能会觉得 go 写起来不爽,毕竟你只考虑自己写的时候的感受就够了
    如果你是一个软件工程师,你会觉得 go 的项目健壮性和工程效率都是极佳的
    代码从来不是写的越少越好,而是越清晰越好
    assiadamo
        76
    assiadamo  
       2 天前   ❤️ 1
    go 贴近操作系统,却反学院派的直觉
    比如 tcp 服务器,学院派上来就和你说,一个链接一个线程等死不能这么写,但 go 给你搞了 gorotine 推荐你这么写,但要被一堆面向 benchmark 的网络层框架拷打:单服百万链接,全 gorotine 啥都不干就能把内存干废,还是 reactor 模型好。
    ixcode
        77
    ixcode  
       2 天前
    又有人往厕所里扔炸弹
    langhuishan
        78
    langhuishan  
       2 天前
    随手写个小工具,编译上传服务器,win 系统双击运行,Linux 系统 chmod +x 运行。你试试 python ,特别是不能联网的 python 看。
    Nazz
        79
    Nazz  
       2 天前   ❤️ 1
    开发效率低只能说明你熟练度低, 不可能学个两三天就有第一语言的熟练度
    sky3hao
        80
    sky3hao  
       2 天前
    目测 op 是语法糖尿病患者, 一般此类患者基本是 java, C++ 为主
    只熟悉了一下 golang 语法就来一顿批判, 见过不少这样的人, 其本质根源其实是因为还没有入门.
    AceGo
        81
    AceGo  
       2 天前
    语法表达简单: 这对于大型项目来说是好事。大项目里,大部分时候在阅读别人的代码,review 、debug 等,代码看过去一眼能看懂在做什么,没有太多心智负担。想象下,全是 lambda 代码,是不是很头痛。ts 更灵活,同样的逻辑能有一百种写法,但阅读他人代码真的是一种折磨。
    Error Handling:写 api 接口,一般会定义清楚用 400 还是 200 处理已知错误。通常是 200+errorMessage ,errorMessage 如果用 throw 抛出来就要区分哪些要在这层 catch ,哪些要在那层 catch ,就要定义各种 throw 区分,这也就跟 go 里的 error 一样的效果了。
    yumenaka
        82
    yumenaka  
       2 天前
    Go 的优点,是你可以在 10 年前发差不多的帖子,然后得到差不多的回答。

    多少有的区别,是用 go 的人明显变多了。
    PTLin
        83
    PTLin  
       2 天前
    你说的都对

    错误处理不用返回-1 然后通过 error 判断具体错误,也不用搞一个 out 指针参数。函数能返回值和错误了,错误还能形成 list ,还能被 wrap ,大进步。

    零值可用,cg 语言,指针逃逸分析确保了代码的内存安全,不会出现悬垂引用,垃圾数据,double-free 这种低级错误,大进步。

    interface ,类型嵌入,结构体方法,极大加强了抽象能力,泛型能力,代码复用能力,相比 c 各种 cast 也是大进步。
    工具链也比较完善,不用 autoconf ,make 那些玩意,文档系统也过得去,也是大进步。

    但是这些也仅仅是让这个“better web google c”变得相比 50 多岁的 c 在人体工学上迈了一小步,相比人体工学做的更好的 native 语言还是差了不少,你可以说这些全是 features ,但是你非要说 go 多好,那我觉得就这个论坛,一个月一次的批判 go 就可以说明问题了。而且退一万步说,go 的发力场所就是 web ,非要用 c 说事多少有点有失公允了。
    @minami
    Martens
        84
    Martens  
       2 天前
    月经贴
    hez2010
        85
    hez2010  
       2 天前
    虽然但是,它执行效率也不高,编译速度特化使得编译优化做的依托答辩,编译出来的代码跑的还没预热后的 Java 快。
    adoal
        86
    adoal  
       2 天前   ❤️ 1
    @iintothewind

    函数式语言(或者函数式特征的多范式语言)往往用的是 typed union 做 patterm match 来处理错误,比如 Haskell 里的 Maybe 和 Either 、Rust 里的 Option 和 Either ,从流程上来讲反而跟 go 的 if err 相像程度高过跟 try-catch 。

    go 的错误处理,最大的坑是,本该用和类型处理的,硬是被它搞成了积类型。if err 的各种槽点,只是书写形式方面的审美问题。
    victorc
        87
    victorc  
       2 天前
    矫情,我现在天天撸 c++,不停地造轮子,踩坑,无比怀念 golang
    xz410236056
        88
    xz410236056  
       2 天前   ❤️ 1
    @javalaw2010 “我曾经也想找一门各方面都完美的语言,集各家编程语言之大成,从前端到后端,从 20 块的嵌入式硬件到几千亿美元的空间站,给广大开发者带来无与伦比的开发体验。结果就是陷在语言选择的囹圄里不能自拔,日月蹉跎”

    你是否在寻找 c#?
    dobelee
        89
    dobelee  
       2 天前
    看回帖 OP 适合花里胡哨的语法糖,这是 go 的弱项,换来的就是所有人都能轻易看懂代码。
    aababc
        90
    aababc  
       2 天前
    @xz410236056 #88 除了出身不好,那都好
    layxy
        91
    layxy  
       2 天前
    相比于目前常用的语言,比如 java,js(ts),python,go 确实不适合写业务,不是不能写,就是写起来有时候很啰嗦,远没有前面几个语言简单,但是优势也很明显,直接编译成目标平台可执行文件并且文件很小,无需依赖和预装环境,比较适合运维或者开发辅助工具或者中间件
    guanzhangzhang
        92
    guanzhangzhang  
       2 天前
    if err 那个等你排错就知道了,java 好多报错很多人都不知道具体是啥原因,而 go 每个地方都 warp 上信息上一眼看出关键信息。
    aloxaf
        93
    aloxaf  
       2 天前
    关于 Go 有个有趣的点,那就是它官网的文档和 Playground 都不提供语法高亮,因为 Rob Pike 不喜欢语法高亮。

    Go 的设计风格,从这里就可见一斑。
    mxT52CRuqR6o5
        94
    mxT52CRuqR6o5  
       2 天前
    go 说是 better C ,但很多用 go 的地方压根儿不会考虑用 C 去写
    securityCoding
        95
    securityCoding  
       2 天前 via Android   ❤️ 1
    等你多维护几个跨语言项目就知道老实人的好了,一天天的语法塘跟个鬼画符似的
    wupher
        96
    wupher  
       2 天前
    - 传统的数据库 / web 使用 golang 主要是为了省钱,资源占用会比 spring 少很多

    - 代价就是你说的,不省人。不过现在反正有 AI 了……

    - golang 确实拿来写网络 App 更方便

    - Rust 也不错,至少对于异常处理使用 Enum 真的比判断返回值和 try / catch 强。但它也有自己的问题

    - 它们只是工具,重要的是使用工具的人
    pigzzz
        97
    pigzzz  
       2 天前
    go 就是编程界的遥遥领先,你讲他的不是,会有一堆拥簇者把你打成筛子
    GreysonYee
        98
    GreysonYee  
       2 天前
    @kele999 之前看了个操作,可以用工具方法的形式来实现。

    func IF[R any](condition bool, trueVal, falseVal R) R {
    if condition {
    return trueVal
    }
    return falseVal
    }
    reeco
        99
    reeco  
       2 天前
    我现在更喜欢用 zig 来代替 golang ,同样优秀的跨平台编译以及标准库,就是手动 gc 麻烦了点
    hunterzhang86
        100
    hunterzhang86  
       2 天前   ❤️ 1
    开发效率低肯定谈不上,go 真的就是简单够用,拒绝一切花里胡哨。
    1  2  
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1030 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 20:06 · PVG 04:06 · LAX 12:06 · JFK 15:06
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.