(纯主观)一个 javaver 用 go 语言的初步体验 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
voidmnwzp
V2EX    程序员

(纯主观)一个 javaver 用 go 语言的初步体验

  •  
  •   voidmnwzp
    NullpointerW 2022-03-04 23:50:30 +08:00 via iPhone 8473 次点击
    这是一个创建于 1394 天前的主题,其中的信息可能已经有所发展或是发生改变。
    以下观点纯属个人主观感受
    1.协程体验完美 无需内核态的上下文切换吊打 jvm 的线程,语法层面也是完爆 一个关键字就完事 go func 吊打 new thread(嗦一大堆).start ()
    2.类型推断也不要太爽 := 和 var 用的不亦乐乎 jdk10 的 var 不知猴年马月才能用到
    3.自定义类型也很香 type Unixtimestamp int64 type Timestamp int64 规范又优雅,结构体可以当值用也可以 new 一个当对象用,关键是再也不用定义恶心的包装类型了以及得注意拆箱的空指针了
    4.自带的轮子少但够用,日期处理一个 time 包就够了,date 、calendar 、localdate 、localtime 、sdf 一边去吧,线程安全 mutex 就够用了、异步转同步 channel 也够了
    5.Gin 使用体验下来也是简洁程度吊打 mvc+springboot ,启动速度更是完爆之,直接交叉编译一个可执行文件丢到服务器上,远离 jar 包
    6.多返回值和函数传参很赞,闭包就更不用提了
    84 条回复    2022-03-09 21:49:55 +08:00
    cmdOptionKana
        1
    cmdOptionKana  
       2022-03-04 23:55:06 +08:00   1
    写小项目是爽,大项目主要还是看生态,Go 的 web 框架要把各种功能凑齐到 spring 的程度也要一番折腾。
    lovegoogle
        2
    lovegoogle  
       2022-03-05 00:01:52 +08:00
    Go 在大规模工程和高并发工程下的表现如何?有了解的吗
    anonydmer
        3
    anonydmer  
       2022-03-05 00:04:17 +08:00
    呵呵,各种吊打
    BrettD
        4
    BrettD  
       2022-03-05 00:04:20 +08:00 via iPhone
    Java 等 Loom
    lostpg
        5
    lostpg  
       2022-03-05 00:13:13 +08:00 via Android
    写 go 得的就很馋 java 增加了那一系列函数式特性,太香了
    Mistwave
        6
    Mistwave  
       2022-03-05 00:25:00 +08:00 via iPhone   8
    蜜月期总是好的
    aliipay
        7
    aliipay  
       2022-03-05 00:26:45 +08:00
    @lovegoogle 楼下解释了,各种吊打
    wangyu17455
        8
    wangyu17455  
       2022-03-05 00:41:38 +08:00 via Android
    不急,你的想法很快就会发生变化
    golangLover
        9
    golangLover  
       2022-03-05 00:50:39 +08:00 via Android   6
    有人会写 new thread. start?
    Akitora
        10
    Akitora  
       2022-03-05 01:11:34 +08:00   1
    同 Java 接触 go ,最不适宜的无非是 err!=nil 和分包的方式,一个目录下所有的文件都算一个包...
    wdlth
        11
    wdlth  
       2022-03-05 01:25:19 +08:00
    还有人 new Thread 的么?至少我们这边大多用 reactor 了。
    6IbA2bj5ip3tK49j
        12
    6IbA2bj5ip3tK49j  
       2022-03-05 02:10:23 +08:00
    啊对对对
    yulon
        13
    yulon  
       2022-03-05 05:02:01 +08:00
    虽然用了很多年 Go ,但是 2022 年了,C++ 都有原生无栈协程了,第一条不能打了
    hello2090
        14
    hello2090  
       2022-03-05 07:54:51 +08:00 via iPhone   1
    盲猜楼主工资 1 万 5 以下?
    silentsky
        15
    silentsky  
       2022-03-05 08:08:37 +08:00 via Android
    像事务的东西能不能像 Java 加一个注解就可以?
    devtiange
        16
    devtiange  
       2022-03-05 08:27:22 +08:00
    楼主说的这些点 C# 早就做到了而且做的更好, 建议体验一把.
    ragnaroks
        17
    ragnaroks  
       2022-03-05 08:57:01 +08:00   5
    我原以为是来喷的,没想到是来夸的,趁这机会我高低得开 10 个箱子
    akagishigeru
        18
    akagishigeru  
       2022-03-05 09:00:18 +08:00   1
    你怎么敢在这喷 Java 的?难道想被喷到哭吗
    Amber2011
        19
    Amber2011  
       2022-03-05 09:32:22 +08:00 via Android
    lombok 也可以用 val 和 var 的
    GGGG430
        20
    GGGG430  
       2022-03-05 09:5842 +08:00
    我看这次吵不吵得起来
    darksword21
        21
    darksword21  
    PRO
       2022-03-05 10:50:35 +08:00 via iPhone
    @hello2090 无语,你这样的工资多少都白瞎
    hello2090
        22
    hello2090  
       2022-03-05 10:58:11 +08:00
    @darksword21 不不不,我的意思是,我感觉纠结于这些的,一般都。。
    lesismal
        23
    lesismal  
       2022-03-05 11:00:52 +08:00
    支持,java 届的人间清醒。
    ps:总有很多巨婴程序员觉得 go 没有这不行、没有那不行,其实都是常年写逻辑的你自己不行
    Goooler
        24
    Goooler  
       2022-03-05 11:02:31 +08:00 via Android
    都不如 kotlin
    lesismal
        25
    lesismal  
       2022-03-05 11:03:16 +08:00
    @hello2090
    #22 也就写习惯了 CURD 简单逻辑的不太纠结这些。如果真都不用纠结,世间岂不早就被 c/cpp 一统江湖了
    terranboy
        26
    terranboy  
       2022-03-05 11:06:04 +08:00
    用 GO 做项目的时候会发现这个要改那个要加 无意中造了好几个轮子。。。 不知道你们有没有这个感觉
    qianxaingmoli
        27
    qianxaingmoli  
       2022-03-05 11:08:13 +08:00
    scala
    DonaldY
        28
    DonaldY  
       2022-03-05 11:21:39 +08:00
    有没有可能是你自己不会用 Java ?不会一些最佳实践?


    代码写太少了。
    darksword21
        29
    darksword21  
    PRO
       2022-03-05 11:21:49 +08:00 via iPhone
    @hello2090 了解!
    displayabc
        30
    displayabc  
       2022-03-05 11:34:25 +08:00
    说一下做 java 多长时间了,做了些什么项目?
    用 go 多长时间了,做了些什么项目?
    给大家一个参考
    v2orz
        31
    v2orz  
       2022-03-05 11:42:33 +08:00
    我感受的最大爽点在编译后的单文件大小,以及在低端设备( arm )上的运行的低配置要求
    路由器、机顶盒这种设备,用 C/C++太难写,还大概率没有 gcc ,用 javaSE 几乎不可能,J2ME 也不好用
    yazinnnn
        32
    yazinnnn  
       2022-03-05 12:01:37 +08:00
    不如 c#
    to2false
        33
    to2false  
       2022-03-05 12:12:38 +08:00
    虽然我用 go ,但是堆业务,exception 还是比 if err != nil 来得舒服的
    halfdb
        34
    halfdb  
       2022-03-05 12:13:16 +08:00 via Android
    我只要看标题就知道这个帖子能上百楼
    iyear
        35
    iyear  
       2022-03-05 12:31:56 +08:00
    我只要看标题就知道这个帖子能上百楼
    FrankAdler
        36
    FrankAdler  
       2022-03-05 12:36:57 +08:00
    私人项目我用 Go 是因为自己的 vps 内存太小,用 Java 跑起来费劲,又不想花钱买贵的,公司项目我推荐用 Go 是因为以前的业务是 PHP ,这帮 PHPer 转 Go 都有点吃力(而且只有一小半的人愿意尝试),Java 更不用想。
    所以如果有得选,企业项目我更愿意用 Java ,因为你说的这些爽点,和 Java 下完善的生态、轮子、方案等对比,我愿意舍弃这些爽点。
    Senorsen
        37
    Senorsen  
       2022-03-05 12:42:21 +08:00 via iPhone   2
    如果是高并发服务的话,go 确实香,跑在老 i5 Mac 笔记本单机 QPS 20w+,内存占用 50M 可能还不到,静态编译体积几 M ,Docker 镜像只需要 from scratch 或 busybox/alpine ,也就是 jiM 到十几 M 大小( hello world 应用 json 返回,fiber 框架)。

    同样的服务用大家最熟悉的 Java Spring Boot ,可能只能几百一千 QPS 吧,内存占用几,镜像体积至少小几百 M (即使只有 JRE+应用也挺大了)。

    当然肯定会有人说,用 Spring Boot 比不公平,应该用 Vertx 之类的异步框架。不过现在主流 Java 版本写异步可能还是没那么顺手的,至少不像 go 那么顺手和自然。不然的话,可能 QPS 几 w 单机也还是行的,内存占用稍多些,JVM 本身启动开销大点。

    如果不是高并发服务,而是业务复杂些的 2B 应用,go 因为设计比较简洁,写起来可能会非常嗦,语法糖各种没 JVM 系的 Spring 框架及 Kotlin 语言那么顺手。收益反而也比较小。( go 开发难度增加很多,部署和运行时带来的收益可忽略不计)
    FrankAdler
        38
    FrankAdler  
       2022-03-05 12:49:25 +08:00
    @terranboy #26 单是文件结构就容易每个项目一种,Go 的最佳实践方案还是不够
    Oktfolio
        39
    Oktfolio  
       2022-03-05 13:11:43 +08:00
    Gin 对标 SpringBoot ?甚至连 SpringMVC 都没法对标...
    pooorguy
        40
    pooorguy  
       2022-03-05 13:12:31 +08:00   1
    javaers in v2ex: 我们中出 了一个二五仔
    chrisia
        41
    chrisia  
       2022-03-05 13:29:00 +08:00
    kotlin 教做人
    hankli
        42
    hankli  
       2022-03-05 13:32:58 +08:00
    又 tm 一个引战贴,
    storyxc
        43
    storyxc  
       2022-03-05 14:26:07 +08:00   3
    go 语言属实是 v 站的流量密码了
    d29107d
        44
    d29107d  
       2022-03-05 14:50:25 +08:00 via Android
    你掌握了 v 站流量密码
    interim
        45
    interim  
       2022-03-05 14:54:22 +08:00
    圣战开启!
    Metre
        46
    Metre  
       2022-03-05 15:45:54 +08:00
    前几天 C fork 调用 golang 编译的库 结果卡死了....
    官方 BUG,没有修复
    ccppgo
        47
    ccppgo  
       2022-03-05 16:46:57 +08:00
    @Senorsen 比 hello world ,PHP 都可以将近 40 万 QPS ,https://workerman.net/doc/webman/ 测试结果在这
    Senorsen
        48
    Senorsen  
       2022-03-05 17:00:20 +08:00 via iPhone   1
    @ccppgo PHP 还是强啊

    跟我大学时刚接触的 PHP 相比,应该已经不是一个概念了


    看了下,排名里你贴的这个 PHP 框架跟 fiber-prefork 的 QPS 基本一样了。确实很强。
    Java 的好多异步框架名列前茅,后续 Java 17 (还是多少来着)的类协程语法支持好了后,应该真的大有可为了。
    好多 PHP 的框架也都在 30w QPS 以上,这在以前真的很难想象,感觉在好几年前,就算是 php-fpm 也很难达到单机十几 w 的并发。时代进步真快。
    C603H6r18Q1mSP9N
        49
    C603H6r18Q1mSP9N  
       2022-03-05 17:31:27 +08:00
    你要写 php 会吹出神了。。。
    haha512
        50
    haha512  
       2022-03-05 19:43:24 +08:00
    java 唯一缺点就是太嗦
    iseki
        51
    iseki  
       2022-03-05 20:10:09 +08:00
    go 的时间库设计成那个样子不一定是好事,有些场景无法很好的处理。
    协程的话,建议你看下 Kotlin 的,和 Go 的轻量级线程不是一类东西,各有各的好处。
    typealias 这个确实不错,等泛型实装应该更好一点。
    Gin 和 Spring 全家桶不是一种东西啊。
    使用多返回值表达错误这从根本上就是裂开的,不比状态码强。(本条个人观点,勿喷)
    9c04C5dO01Sw5DNL
        52
    9c04C5dO01Sw5DNL  
       2022-03-05 21:01:30 +08:00
    仅仅说下协程,kotlin 的 coroutine 优点是结构化并发,缺点是异步函数具有传染性。

    goroutine 刚好相反。
    byte10
        53
    byte10  
       2022-03-05 21:06:02 +08:00
    @wdlth reactor 本质还是异步,甚至比异步更恶心,写习惯应该还能顶住。
    @terranboy 因为本质是低端语言的(手动狗头)。从语法上来说我觉得 go 比 nodejs 还要低端,不过 nodejs 也是经常造轮子。

    以前我也觉得 nodejs 很方便,比写 java 方便多了。不过也就是那样,在大型的工程,nodejs 还是要在旁边呆着,不好搞。觉得 java 不好,去看看 C#,应该是= java 20 版。
    aptupdate
        54
    aptupdate  
       2022-03-05 21:10:56 +08:00 via iPhone
    别的不说,单就看到 date 、calendar 、localdate 、localtime 、sdf 这几个词就一把辛酸泪。
    Hanggi
        55
    Hanggi  
       2022-03-05 21:22:26 +08:00
    非常不理解,语言这种东西为什么要站队,都会不香吗?
    mogging
        56
    mogging  
       2022-03-05 21:36:15 +08:00
    适合做中间件,高并发相关的后端
    yaott2020
        57
    yaott2020  
       2022-03-05 21:39:04 +08:00 via Android
    个人项目用 go 写非常爽
    yaott2020
        58
    yaott2020  
       2022-03-05 21:39:24 +08:00 via Android
    特别是小型的服务
    looplj
        59
    looplj  
       2022-03-05 21:45:55 +08:00
    果然只是初步体验。。
    虽然我现在也主要用 Go ,但是总还是觉得 Go 缺的东西太多了。。
    你说的这几点除了 1 协程更方便,5 Go 更轻量以外,其他应该没有一个是 Go 比 Java 好的,最多只是各有千秋。。
    chaodada
        60
    chaodada  
       2022-03-05 21:47:14 +08:00
    looplj
        61
    looplj  
       2022-03-05 22:09:23 +08:00
    @giiiiiithub 其实 Go 协程也是有传染性的,就是大家都要用 Go 。以前用 C / CPP 写的都要重写。
    9c04C5dO01Sw5DNL
        62
    9c04C5dO01Sw5DNL  
       2022-03-05 22:23:57 +08:00
    @ZSeptember 啊?这算啥传染性 [狗头]
    EscYezi
        63
    EscYezi  
       2022-03-06 01:27:55 +08:00 via iPhone
    那用 rust 不是更爽,连 GC 都不用
    Leviathann
        64
    Leviathann  
       2022-03-06 02:30:42 +08:00
    @byte10 C#不考虑 async 和 loom 不同的话,应该是 java26+
    zinwalin
        65
    zinwalin  
       2022-03-06 07:49:27 +08:00 via iPhone
    @hello2090 那你年薪有 60 万以上吗?
    xuanbg
        66
    xuanbg  
       2022-03-06 08:15:53 +08:00
    Java 也能自己封装一个线程池啊,方便不方便还不是自己说了算。。。
    yanmu6626
        67
    yanmu6626  
       2022-03-06 08:44:50 +08:00
    个人项目还行,主要是用于替代 python 了,稍微严谨的项目还是用 Java,至少我喜欢这样
    Akiya
        68
    Akiya  
       2022-03-06 10:24:16 +08:00
    难道就没有体验过 var a := int(math.Max(float(b), float(c)) 吗
    hello2090
        69
    hello2090  
       2022-03-06 10:32:42 +08:00 via iPhone
    @zinwalin 比 60 高一些。。
    aababc
        70
    aababc  
       2022-03-06 10:33:45 +08:00
    @Akiya 看了你的代码,感觉整个人都脏了,这可能就是我们理解不了的指导思想,引入泛型以后是不是就能解决这个问题了。
    aababc
        71
    aababc  
       2022-03-06 10:38:27 +08:00
    @aababc 感觉好像理解错了,应该是人家就不想实现这样的东西
    OxO
        72
    OxO  
       2022-03-06 12:00:53 +08:00
    只是单纯地因为讨厌其语法而不想学 GO 。
    Jooooooooo
        73
    Jooooooooo  
       2022-03-06 13:02:39 +08:00
    你 java 还在用 new Thread 那自然会觉得别的语言不错...
    voidmnwzp
        74
    voidmnwzp  
    OP
       2022-03-06 13:18:47 +08:00 via iPhone
    @Jooooooooo 线程池 submit 就舒服了?
    yl20181003
        75
    yl20181003  
       2022-03-06 14:19:54 +08:00 via Android
    @Akiya 体验过了,很难受,又没办法
    MrVito
        76
    MrVito  
       2022-03-06 22:40:15 +08:00
    说到这个我就情不自禁的提起,常年写 C++的人偶尔写一下 python 是多么神清气爽,心旷神怡了
    bugfan
        77
    bugfan  
       2022-03-06 23:12:47 +08:00
    bugfan
        78
    bugfan  
       2022-03-06 23:13:40 +08:00
    @cmdOptionKana 用 go 写一个类似 spring 的东西也不难吧,,,
    bugfan
        79
    bugfan  
       2022-03-06 23:17:05 +08:00
    17 年开始写 c ,go ,后来一直是 go ,,,,这些年,明显感觉 go 的人越来越多了,17 年时候只记得 jd 已经开始招聘 golang 工程师了,但当时招聘 go 的还是太少,,,
    GBdG6clg2Jy17ua5
        80
    GBdG6clg2Jy17ua5  
       2022-03-07 08:57:50 +08:00
    go 语言,慢慢的就会凑够包管理、泛型、异常处理了,别急,会越来越像 c#的
    CoderGeek
        81
    CoderGeek  
       2022-03-07 10:20:07 +08:00
    @bugfan jd 的 go 也很少
    dany813
        82
    dany813  
       2022-03-07 14:25:07 +08:00
    日常 go vs java
    bthulu
        83
    bthulu  
       2022-03-07 15:16:18 +08:00
    go 在特殊时期会被制裁啊, 就这一条就坚决不能用 go
    zinwalin
        84
    zinwalin  
       2022-03-09 21:49:55 +08:00 via iPhone
    @hello2090 那相当可以了
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2674 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 33ms UTC 09:06 PVG 17:06 LAX 01:06 JFK 04:06
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86