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

Go 写业务真的是好的选择吗

  •  
  •   soupu626 · 2023-02-03 17:26:30 +08:00 · 10949 次点击
    这是一个创建于 439 天前的主题,其中的信息可能已经有所发展或是发生改变。
    1. 本人 JAVA 转 GO ,JAVA 练习时长四年,GO 练习时长半年
    2. GO 本身写起来是比较爽,语法简练,不啰嗦
    3. 但是为啥啥啥都要自己写啊,list.contains 都要手写个 forr,还不支持范型(公司项目 go 版本比较低)怀念 guava/common-lang /redission 等等
    4. 个人感觉从语法层面,kotlin 或者 java+lombok 已经可以让语法简单很多了
    5. 同时在业务开发的场景下,语言性能 go 真的能拉开很大的差距么,瓶颈不是一般都在数据库等外部 IO 上,性能层面还有 JIT 这种东西来辅助 JVM
    6. 如果让各位老哥做技术选型,会选 go 作为业务开发的技术栈么
    75 条回复    2023-05-21 12:43:59 +08:00
    dolorain
        1
    dolorain  
       2023-02-03 17:28:51 +08:00
    是的
    lbp0200
        2
    lbp0200  
       2023-02-03 17:31:40 +08:00
    增删改查,不要用 go 写,kotlin 真香
    aw2350
        3
    aw2350  
       2023-02-03 17:32:59 +08:00   ❤️ 1
    也不是所有业务的最好选择,
    但是大部分业务 go 都能做,且轻量,编译 启动的也快,
    说都微服务时代了,还有什么业务拆分后不够原子化?原子化=简单。简单=高效
    gazi
        4
    gazi  
       2023-02-03 17:35:19 +08:00
    写过一段时间,基本上同感。 第三方好用的库太少。orm 也很难用 (相比于其他语言)。 等生态丰富以后再考虑了
    yekern
        5
    yekern  
       2023-02-03 17:39:17 +08:00
    最近都是拿 go 些一些 针对性的业务 , 200 一个 main 文件 200 行搞定那种, 编译好服务器一丢完活用着还是比较省心的.

    或者写一些中间件,很少写数据库之类的 太麻烦了
    cheng6563
        6
    cheng6563  
       2023-02-03 17:40:11 +08:00   ❤️ 1
    你别想着 go 是 java ,c#同级产品,你把他想成 c 的优化版就行了。

    用 c 写业务能吐血,换 go 不就爽得飞起?
    coderxy
        7
    coderxy  
       2023-02-03 17:40:20 +08:00
    go 是其它语言的不想转 java ,跟你玩换赛道的, 你一个已经在做 java 的凑这个热闹干嘛 🤣
    fiypig
        8
    fiypig  
       2023-02-03 17:42:52 +08:00
    go hello() 就省事很多
    soupu626
        9
    soupu626  
    OP
       2023-02-03 17:44:50 +08:00
    @coderxy 换工作了,这家给的比较多,但是开发语言是 go
    sadfQED2
        10
    sadfQED2  
       2023-02-03 17:45:28 +08:00   ❤️ 1
    企业里面换语言主要还是方便 CTO 清理老人,除了 Go ,换 java 、php 、ruby 、python 任何语言都有人反对,但是 Go 可以。

    另外 go 部署简单、语法简单、没有 jvm 那么多乱七八糟的调优,随便谁上来看几天就能写,这就是 Go 的优势。社区方面现在也很成熟了,基本上没有你找不到的轮子
    julyclyde
        11
    julyclyde  
       2023-02-03 17:46:06 +08:00
    升级啊
    低版本、出身于 google 的各种软件,基本上就是 google 把自家十年前的弯路放出来祸害社会
    coderxy
        12
    coderxy  
       2023-02-03 18:00:33 +08:00
    @soupu626 那就干呗, 后端换个语言没啥压力吧。 多学一门又不坏事
    securityCoding
        13
    securityCoding  
       2023-02-03 18:28:31 +08:00
    挺好的,没那么多弯弯绕绕的花肠子,大家都一个风格
    Actrace
        14
    Actrace  
       2023-02-03 18:29:51 +08:00
    做业务。。PHP 微笑路过。
    DefoliationM
        15
    DefoliationM  
       2023-02-03 18:37:25 +08:00 via Android
    看人,喜欢什么用什么,我觉得都不如 rust
    bleoo
        16
    bleoo  
       2023-02-03 18:42:12 +08:00
    @soupu626 只要钱给够,干啥都行😁
    opengg
        17
    opengg  
       2023-02-03 19:33:50 +08:00   ❤️ 2
    go 语言:
    程序员的时间不值钱,比编译器的时间还贱价,所以活该程序员天天写 if err != nil
    当然你可以用 snipets ,你甚至还可以用 chatgpt 来提升写代码的效率,那你看代码的时候脑子里还得带一个 parser 。
    dgqypl
        18
    dgqypl  
       2023-02-03 19:37:50 +08:00
    Go 1.18 开始支持泛型了
    morri
        19
    morri  
       2023-02-03 19:43:59 +08:00
    @gazi goframe 真的很好用啊, 大家没发现吗?
    shore123
        20
    shore123  
       2023-02-03 19:44:45 +08:00   ❤️ 1
    你不会唱跳还有 rap 没有用的
    Mexion
        21
    Mexion  
       2023-02-03 19:49:29 +08:00 via iPhone   ❤️ 1
    先说我的观点:不是。
    我也写了两年 GO 了,写业务比 Go 好的语言多的是,如果说能不能写那肯定能写,但就是各种不爽。
    gowk
        22
    gowk  
       2023-02-03 20:00:35 +08:00
    目前来说写业务确实比不上 Java C#,但是好在容易上手,学习成本极低
    有 Go 老人带 + 项目结构清晰,用起来也不是不可以,起码代码人人都能读懂
    用 Java ?现在的 Java + 各种库的学习成本太高了,写好不容易
    新手写出来的代码惨不忍睹,我们团队就全面转 Go 了
    xingjue
        23
    xingjue  
       2023-02-03 20:08:36 +08:00
    java 挺适合业务的
    uiosun
        24
    uiosun  
       2023-02-03 20:15:44 +08:00   ❤️ 1
    @gowk 老哥,请教,怎么规避到处都是 if err != nil 的情况?

    转 Go 还没太久,可这个错误判断,已经写的有点麻木了……
    xsen
        25
    xsen  
       2023-02-03 21:33:20 +08:00
    我们用 go 有三年差不多了,复杂的业务其实也不少,不过基本都拆成不同的服务
    服务之间是 rest api 或者 grpc ,也没太大的问题

    目前看坑呢,一个是维护完善了一个工作流、内部自己实现了一套授权服务
    别的感觉没太多的坑。上手容易,包括新手、新生,代码质量差不太多。开发、调试、部署相对简单(对于其它语言来说)
    neoblackcap
        26
    neoblackcap  
       2023-02-03 22:38:33 +08:00
    @uiosun 没有,这个是 golang 得标准错误处理,判断是必须判断的,否则就属于放弃错误处理。想不这样搞,那么就得去用别的语言
    dcoder
        27
    dcoder  
       2023-02-03 23:01:58 +08:00
    有段时间没写 Go 了
    Go 啥时候能简化满屏 if err != nil {return err}, 才好意思说自己方便写业务逻辑 -_-
    iseki
        28
    iseki  
       2023-02-03 23:08:17 +08:00 via Android
    @uiosun 规避不了,忍,或者换 Kotlin (
    roundgis
        29
    roundgis  
       2023-02-03 23:09:33 +08:00 via Android
    抽插數據庫顯然 c# java 是更好的選擇

    go 是 c with gc

    用 c 寫業務也不是不可以 以前很多人都幹過

    後來都用 java 了
    GeruzoniAnsasu
        30
    GeruzoniAnsasu  
       2023-02-03 23:34:28 +08:00
    iyaozhen
        31
    iyaozhen  
       2023-02-03 23:36:17 +08:00
    你 go 不用最新版,搞个蛋
    本来生态就不行,还不升级

    主要还是生态,如果你公司没有人牵头,用起来还是比较头疼
    Valid
        32
    Valid  
       2023-02-03 23:50:41 +08:00
    综合目前所有的业务场景,go 非常合适,非常灵活
    night98
        33
    night98  
       2023-02-04 00:52:33 +08:00
    java ,kotlin ,觉得速度慢上 spring-navite ,还有个 quarkus ,go 的异常机制就决定了他本身压根不适合做业务
    izzy27
        34
    izzy27  
       2023-02-04 01:33:19 +08:00
    好处是简单
    缺点是生态弱,不过这个会改善的
    izzy27
        35
    izzy27  
       2023-02-04 01:34:10 +08:00
    go 这个工具真的很简单易用,而且容易上手,实习的时候我看了三天直接上手写单测,一周后就开始做需求了。。
    lujiaxing
        36
    lujiaxing  
       2023-02-04 02:14:49 +08:00   ❤️ 1
    个人感觉拿来写框架还是蛮好, 但是做业务还是算了吧. GO 的生态甚至不如 .NET Core
    Akitora
        37
    Akitora  
       2023-02-04 02:44:26 +08:00 via Android
    个人认为 go 最适合写一些网络中间件,写起来又快又舒服。尝试着用 go 写过一些业务,虽然不是不能写但真是各种不舒服…包括项目架构和错误处理之类
    fgwmlhdkkkw
        38
    fgwmlhdkkkw  
       2023-02-04 03:42:00 +08:00
    @uiosun #24 有两种办法,都需要泛型的支持。

    1 ,func Must[T any](v T, err error) T, Must2[T any, A any](v T, a A, err error) (T, A), ...
    2, type Result[T any] struct {
    Error error
    Value T
    }
    kennylam777
        39
    kennylam777  
       2023-02-04 06:32:20 +08:00
    Go 和 Kotlin 都用過,業務還是 Kotlin 好,一流的 Java 生態,語法糖簡單可靠。

    Go 用來寫小巧的 infra 工具還好,但業務就算了吧,省下的計算資源是你自己的除錯時間。
    realpg
        40
    realpg  
       2023-02-04 06:37:44 +08:00   ❤️ 1
    golang 给猴子,一只猴都能写单机 12W QPS 的综合 api server ,套个负载均衡就能百万并发,单机进程使用内存不超过 1GB

    java ?猴子还没整明白 jvm 参数呢
    zed1018
        41
    zed1018  
       2023-02-04 08:52:25 +08:00
    不会选 go ,太丑,完全看不下去。点开 go 的源码血压一下就上来了。Dart 同理
    Breacher
        42
    Breacher  
       2023-02-04 09:00:23 +08:00 via iPhone
    @izzy27 Go 生态里缺少呢
    tairan2006
        43
    tairan2006  
       2023-02-04 09:04:26 +08:00 via Android
    凑合用,另外 go 的兼容性很好,我们一直用最新版。不知道你们坚持旧版本意义何在。
    chendy
        44
    chendy  
       2023-02-04 09:23:04 +08:00   ❤️ 3
    java 给猴子,一只猴都能在 120w 行代码的屎山上持续拉屎,再忽悠客户多买几套 license 多加几个服务器,直接与客户双赢

    go ?猴子还没整明白业务逻辑呢
    Breacher
        45
    Breacher  
       2023-02-04 09:35:21 +08:00   ❤️ 1
    我觉得非常合适。

    本人是一个 Android 转 Go 的后端业务程序员,我能够顺利转过来,只因 Go 的优点让从写代码到部署投入使用的难度非常低:Go 开发环境搭建非常简单、Go 语法非常简洁、上手 Go 时不用学习框架、应用跑起来就能给客户端使用,不用考虑配置 Nginx 之类、要部署到服务器也就 go build 然后 scp 等等,这些都让我上手后端的过程中没有遇到难度和阻碍。

    多年体验下来,我觉得 Go 的优点有:
    - `语法简洁`:Go 中共有 25 个关键字,很容易上手 Go 编程。
    - `灵活`:Go 属于编译型的静态语言,但是 Go 的很多特性使得用 Go 编程像使用动态脚本语言一样的灵活,比如使用 `:=` 初始化变量。
    - `标准库齐全`:Go 拥有一个比较齐全的标准库,`net/http` + `encoding/json` 组合即可快速开始 API 开发,`testing` 包是 Go 的使用得最多的单元测试库,等等。
    - `多平台支持`:Go 环境支持 Linux 、macOS 、Windows, 在 Linux 、macOS 平台还支持 amd64 和 arm64 CPU 指令。
    - `跨平台编译` :支持交叉编译,可以方便地在一个平台打包构建另一个平台的二进制文件。
    - `编译时间短`:Go 的编译速度非常快。
    - `二进制`:程序编译结果是一个二进制文件,Go 程序生成的二进制可执行文件常常拥有以下优点:
    - 程序部署速度快,无运行时环境搭建的需求
    - 启动快
    - 执行速度快
    - 内存消耗少
    - `内置并发支持` :使用 go 关键字即可启动一个新的 goroutine ,相比 Java 的 Thread/Runnable 快速方便。
    - `社区`:Go 拥有一个活跃和回应快速的社区,社区贡献了大量高质量的第三方库包和应用。
    - `版本的升级和演化`:Go 官方团队对 Go 语言的特性升级和演化非常谨慎,Backwards Compatibility 非常好,这避免了 Python 和 Java 等语言的版本悲剧。
    - `工程化`:与其他作为学术实验开始的语言不同,Go 代码的设计是务实的。每个功能和语法决策都旨在让程序员的生活更轻松。
    - `代码格式`:由于单一的标准代码格式,Go 通常被认为比其他语言更具可读性。
    - `容器化` :Go 程序的镜像体积小,更加容易分发,更适合用来开发容器化应用。

    语言有它的用户之地,Go 适合用在:
    - API/RPC services ,Go 2020 的调查问卷公布的结果
    - CLI 工具开发
    - Infra
    - ...
    然后多个语言可能在某个具体的应用场景有竞争,比如 Go/PHP/Python/Java 都可以用来开发后端服务,然后就有了做后端用哪个好的讨论。。。

    但每个语言都有它自己的不可替代的地方:
    - Go (简洁 /一流的 Backwards Compatibility/全流程高效率(指的是编译、部署、运行))
    - Java 大数据领域( Android ?)
    - Python (脚本,数据分析...)
    - PHP (说不太上,可能是更加快速的后端 MVP 服务交付?)
    xyjincan
        46
    xyjincan  
       2023-02-04 11:07:25 +08:00
    @uiosun rs,_ = try_xxx()
    wdwwtzy
        47
    wdwwtzy  
       2023-02-04 11:22:50 +08:00 via iPhone   ❤️ 11
    推荐用 go 写业务的人,有一个算一个,不是蠢就是坏
    yazinnnn
        48
    yazinnnn  
       2023-02-04 11:25:51 +08:00
    如人饮水,冷暖自知

    在条件允许的情况下, 自然是选择自己用着最舒服的工具干活
    一些人用着 kotlin 觉的非常甜, 自然就有另一些人非常讨厌 kotlin 的语法糖
    go 也一样, 一些人喜欢 go 简单的语法, 自然也有另一些人觉的其丑陋

    一般业务基本默认 io 密集型, jvm 用户在没有使用 loom 或 netty 或其他 nio 底层的框架时性能是肯定不如 go 的
    想跟 go 比性能除非生产中用 jdk19(基本不可能)或者使用异步框架 vertx,quarkus,spring reactive 等, 学习这些东西的成本+复杂的响应式业务比 java 用户转 go 成本也许差不了多少
    leonshaw
        49
    leonshaw  
       2023-02-04 11:49:16 +08:00
    原生支持有栈协程的语言真没几个,不知道 Java 的虚线程用起来咋样。
    Nazz
        50
    Nazz  
       2023-02-04 14:45:47 +08:00 via Android
    1.18 就支持泛型,现在已经到了 1.20 了. 很多东西完全可以自己造轮子,比如说 ArrayList, 三元操作符
    brucedone
        51
    brucedone  
       2023-02-04 15:49:29 +08:00
    推荐用 go 写业务的人,有一个算一个,不是蠢就是坏
    ===

    这话放任何语言都合适
    des
        52
    des  
       2023-02-04 16:09:16 +08:00 via iPhone
    建议各位讨论说说你指的是什么业务

    顺便 50 楼说的 ArrayList 、三元操作符也需要自己造轮子是真的吗?
    hedwi
        53
    hedwi  
       2023-02-04 16:21:34 +08:00
    go 很完美了 觉得 go 不好的可能是写代码太少了
    ilylx2008
        54
    ilylx2008  
       2023-02-04 16:46:20 +08:00
    fkdog
        55
    fkdog  
       2023-02-04 16:53:27 +08:00   ❤️ 1
    其实你不搞 controller service dao 分层,Java 倒也不会太复杂。
    DBUtils crud 也是几句话的事。
    java 写久了,有时候的确很容易把 java 那种写法代入到其他语言里。

    其实国内这些互联网服务,瓶颈往往都是在架构层面,而非语言层面。
    所以分库分表、分布式事务、异构数据同步等一类的架构方案,java 相关解决方案真的是太多了。

    业务层真的没什么好的理由去换 go 。
    maigebaoer
        56
    maigebaoer  
       2023-02-04 17:02:08 +08:00 via Android
    看时什么业务吧,php 我也觉得很好,短平快
    clownpiece
        57
    clownpiece  
       2023-02-04 17:12:18 +08:00
    我真的觉得很奇怪,在一个公司里难道还能想转语言就转的吗。不都是得看公司的基础架构支持哪个语言就用哪个吗,就算支持多种也有个主语言,支持的功能更多更好。
    假设你是个绝顶高手,举个例子换 rust 写业务逻辑并发是以前的 10 倍,监控、配置中心、各种储存的中间件全部都自己来写吗,还是说准备裸的直接上了。
    realpg
        58
    realpg  
       2023-02-04 20:41:22 +08:00
    @tairan2006 #43
    架构师 /运维是旧时代人而已

    golang 只要你不用 [指针的奇淫技巧] (特意括上了断句) 基本就没有兼容性问题
    Nazz
        59
    Nazz  
       2023-02-04 20:54:36 +08:00 via Android
    @des 有内置的动态数组,简单包装下就是 ArrayList 了; go 几乎没有语法糖,对符号的使用非常谨慎,所以没有三元操作符,现在有泛型了解决方法很简单.
    Nazz
        60
    Nazz  
       2023-02-04 20:56:39 +08:00 via Android
    @hedwi 唯一不完美的就是错误处理,要是有语法糖隐式返回错误就好了
    iseki
        61
    iseki  
       2023-02-04 20:57:14 +08:00 via Android
    @xyjincan 把一个可以快速发现的 bug 变成完全的灵异事件,真棒👍
    iseki
        62
    iseki  
       2023-02-04 21:00:36 +08:00 via Android
    @Nazz ArrayList 需要自己造轮子这事其实非常恐怖
    des
        63
    des  
       2023-02-04 22:32:57 +08:00
    @Nazz 这边建议您看看 rust 呢
    djoiwhud
        64
    djoiwhud  
       2023-02-04 23:21:02 +08:00 via Android
    go 实现业务处于谁都不服谁的状态。不同的公司,方案差异极大。
    LostPrayers
        65
    LostPrayers  
       2023-02-05 00:32:21 +08:00   ❤️ 1
    不好,我写 go 写出了内存泄漏,这是以前写 java 遇不到的🤣🤣
    Dogtler
        66
    Dogtler  
       2023-02-05 00:38:47 +08:00 via iPhone
    不好,业务选择建议 node 或 php
    如果服务不在 k8s 容器化,那么是有些鸡肋
    daiv
        67
    daiv  
       2023-02-05 05:54:20 +08:00
    @ilylx2008 #54 感谢推荐, 这个库👍🏻
    findex
        68
    findex  
       2023-02-05 19:41:21 +08:00
    看大家说 go 和其他语言的比较。大多是在比较 java ,有没有比较一下 python 的?

    或者比较一下 dart ,都是出自 google 。dart 特性和 go 很相似,但是 dart 语言更更小众了。很多方面还没有 go 完善,但是你要说写逻辑,哪个语言都行吧。就看你想达到什么目的。dart 现阶段的 dart vm 类似 java vm ,性能会比 standalone executable 二进制文件效率高,由于 vm 对系统资源调度优化。这点和 java vm 学的很不错。但是在一些数学计算上,以及大数据量处理上就不行了,还没学到 go 的精髓。再看 benchmark ,总觉得不如 c++优化好。再追求极致一点,还是 C 速度快一点。然后 rust 还能出来打一下,然后还有 zig 语言。

    看看这个比较,https://programming-language-benchmarks.vercel.app/dart-vs-go
    go 更后端一点。数据量一大,dart 就 timeout 了。其实这只是片面的 dart exe 和 go exe 比较,如果这时候用 dart vm vs go 比较,dart 的性能不会至于这么尴尬。

    我要吐槽一句,你刚看完的 dart 教程可能在下个版本的 dart 里面没用了。迭代更新速度很快。
    WhoMercy
        69
    WhoMercy  
       2023-02-05 20:10:39 +08:00
    用 go 会有问题,但问题不在 go
    aladdinding
        70
    aladdinding  
       2023-02-06 10:56:34 +08:00
    不会做抽象么 照着逻辑硬写当然不舒服(想写屎山那没办法)
    xiaocaiji111
        71
    xiaocaiji111  
       2023-02-06 13:51:19 +08:00
    不好,复杂业务写着确实累,还不优雅,很多东西要手撸一遍。很多人推荐写业务估计局限于 go 有限得语法和生态,可能没有写过其他语言。

    但是如果小项目(几个 api 接口),工具类我会优先选择 go ,总不能把 java 那一套搬上来吧。

    都是码农,根据项目情况来选择就行,当然上班,那就公司用啥你写啥嘞。
    vitoliu
        72
    vitoliu  
       2023-02-06 15:04:23 +08:00
    Java 这么简单都没学明白,学着相比下不够成熟的 Go 一边说 Go 真牛逼,真的好吗?
    xuyang2
        73
    xuyang2  
       2023-02-06 16:48:56 +08:00
    感觉 Go 的接口和组合,比 Java 容易被滥用的继承,可读性和可维护性高很多
    unknowsun
        74
    unknowsun  
       333 天前
    @Breacher 你好,方便留个联系方式吗, 我目前也是 Android 转 Go , 还在学习中, 想了解一下后续找工作的话应该怎么,简历应该怎么写
    Breacher
        75
    Breacher  
       332 天前 via iPhone
    @domain9065 用 Telegram 吧,Base64 解码这个得到我的 username:QHh1YW55dWVsaW5ncWk=
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5642 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 03:19 · PVG 11:19 · LAX 20:19 · JFK 23:19
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.