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

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

  •  
  •   voidmnwzp ·
    NullpointerW · 2022-03-04 23:50:30 +08:00 via iPhone · 7736 次点击
    这是一个创建于 866 天前的主题,其中的信息可能已经有所发展或是发生改变。
    以下观点纯属个人主观感受
    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 个箱子
    JaguarJack
        18
    JaguarJack  
       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:58:42 +08:00
    我看这次吵不吵得起来
    darksword21
        21
    darksword21  
       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  
       2022-03-05 11:21:49 +08:00 via iPhone
    @hello2090 了解!
    haython
        30
    haython  
       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 的并发。时代进步真快。
    shanghai1998
        49
    shanghai1998  
       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 全家桶不是一种东西啊。
    使用多返回值表达错误这从根本上就是裂开的,不比状态码强。(本条个人观点,勿喷)
    giiiiiithub
        52
    giiiiiithub  
       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
    特别是小型的服务
    ZSeptember
        59
    ZSeptember  
       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
    ZSeptember
        61
    ZSeptember  
       2022-03-05 22:09:23 +08:00
    @giiiiiithub 其实 Go 协程也是有传染性的,就是大家都要用 Go 。以前用 C / CPP 写的都要重写。
    giiiiiithub
        62
    giiiiiithub  
       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
    @hello2090 666😂
    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 的还是太少,,,
    angryfish
        80
    angryfish  
       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   ·   实用小工具   ·   3275 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 04:48 · PVG 12:48 · LAX 21:48 · JFK 00:48
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.