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

用 Go 开发公司内部的业务系统,后端该如何选型?

  •  
  •   gowk ·
    qinjinling · 2022-07-04 17:45:32 +08:00 · 13700 次点击
    这是一个创建于 874 天前的主题,其中的信息可能已经有所发展或是发生改变。

    对于 Go 一直在关注和了解,写过几个玩具项目,实际工作中没有使用过。现在有几个公司内部项目需要启动,想组建一个 Go 团队,刷选了几轮简历发现应届生或者毕业一两年的,简历上面 Go 的身影越来越多。

    倒不是排斥 Java ,说实话写 Java 心智负担较重,看过很多 Java 写的项目代码是惨不忍睹,导致现在看到 Java 就有一种「恶心」的感觉,其实也明白 Java 确实比较适合写业务,但是我觉得写好并不容易,尤其是对一些刚毕业开发经验少的同学来说。

    另外我十分赞同 Rob Pike 的这段话:

    "The key point here is our programmers are Googlers, they’re not researchers. They’re typically, fairly young, fresh out of school, probably learned Java, maybe learned C or C++, probably learned Python. They’re not capable of understanding a brilliant language but we want to use them to build good software. So, the language that we give them has to be easy for them to understand and easy to adopt."

    这也是我想全面转用 Go 语言的原因

    • 有其他语言背景可以快速上手
    • 简单高效,心智负担小(没有面向对象、继承)
    • 开源社区有大量的库辅助开发
    • 1.18 终于上了泛型
    • 大爱 gofmt ,if err != nil (doge

    因为是公司内部业务系统,没必要上微服务,且前端打算使用 Vue 2|3 ,想请教大家两个问题:

    • 后端如何选型?
    • 如何分层,项目结构如何布局?
    第 1 条附言  ·  2022-07-04 19:01:50 +08:00
    看大家都在推荐 goframe
    今晚再深入研究一下
    另外大家可以说说团队用的一些轻量级基础设施
    比如 api 接口文档用什么? swagger ?
    DevOps 用 gogs 还是 gitea ?
    项目管理工具呢(之前用过 redmine)?
    107 条回复    2024-07-08 17:47:19 +08:00
    1  2  
    a330202207
        1
    a330202207  
       2022-07-04 17:47:58 +08:00   ❤️ 1
    goframe 吧
    fzdwx
        2
    fzdwx  
       2022-07-04 17:48:57 +08:00
    还招人吗,github.com/fzdwx 需要简历吗?
    TWorldIsNButThis
        3
    TWorldIsNButThis  
       2022-07-04 17:52:23 +08:00 via iPhone   ❤️ 2
    那我建议 ts 后端
    yunxi
        4
    yunxi  
       2022-07-04 17:53:03 +08:00
    go 确实还是比较不错的,写一下具体选型把:
    http 框架: gin (使用比较广泛,目前没有发现问题)
    ORM : gorm (使用简单,易上手,使用比较广泛)
    日志:logrus
    ...
    其他楼主可以自行 google ,找一些大家常用的包即可。
    项目分层,可以看看我之前写的一片文章 https://www.artacode.com/post/golang/template/
    dqzcwxb
        5
    dqzcwxb  
       2022-07-04 17:53:36 +08:00   ❤️ 1
    "但是我觉得写好并不容易,尤其是对一些刚毕业开发经验少的同学来说。"-这句话是用初学者的角度评价 java
    "有其他语言背景可以快速上手"-这里是想要有工作经验和一门语言的程序员,至少不是初学者
    mekingname
        6
    mekingname  
       2022-07-04 17:56:15 +08:00
    试一试用两天 gin-vue-admin ,如果你用这个项目用起来很顺手的话,那么后端选型就很容易了,直接 gin.
    gowk
        7
    gowk  
    OP
       2022-07-04 17:58:21 +08:00
    @a330202207
    了解过这个框架,感觉还不错,感觉选型,研究各种框架真的很累
    期待有人甩给我一个 GitHub 示例项目地址,直接开干🤣
    gowk
        8
    gowk  
    OP
       2022-07-04 17:59:43 +08:00
    @fzdwx #2
    我们是国企,小地方,离北京很近
    不加班,想 work-life-banlance 的可以考虑一下
    gowk
        9
    gowk  
    OP
       2022-07-04 18:00:52 +08:00
    @TWorldIsNButThis #3
    ts 能比 Go 好写?
    gowk
        10
    gowk  
    OP
       2022-07-04 18:03:00 +08:00
    @yunxi #4
    谢谢,算是中规中矩的了,另外 ORM 我打算用 ent
    voidmnwzp
        11
    voidmnwzp  
       2022-07-04 18:19:26 +08:00 via iPhone
    放心 泛型不会大规模使用 这几年内
    iosyyy
        12
    iosyyy  
       2022-07-04 18:21:49 +08:00 via Android
    建议直接 goframe 其他的要配一大堆东西才能算一个项目
    iwdmb
        13
    iwdmb  
       2022-07-04 18:24:52 +08:00
    内部系统 GoFrame +1
    helone
        14
    helone  
       2022-07-04 18:25:53 +08:00   ❤️ 2
    gofiber + entgo
    wzw
        15
    wzw  
       2022-07-04 18:28:37 +08:00
    GoFrame + 1 (gin 和 GoFrame, 我选了 GoFrame, 简单易用+够用)
    Gota
        16
    Gota  
       2022-07-04 18:33:02 +08:00
    刚上手建议用比较轻量级的框架,比如 https://github.com/go-chi/chi

    项目结构可以参考我之前写的一篇博客: https://blog.igota.net/posts/20220422/
    bigbigpark
        17
    bigbigpark  
       2022-07-04 18:45:16 +08:00
    想省心上 GoFrame 吧
    hLc1
        18
    hLc1  
       2022-07-04 19:19:49 +08:00 via Android
    ts 后端也没问题,ts 的 nestjs 框架不同风格的 orm 就提供了 4 种,框架大而全。
    hLc1
        19
    hLc1  
       2022-07-04 19:23:34 +08:00 via Android
    之前知乎上有个团队用 nestjs 写游戏,80w 行代码游戏的项目毫无压力。
    brucedone
        20
    brucedone  
       2022-07-04 19:29:54 +08:00
    goframe , 解决 orm , 常用轮子,分层,等常见问题
    welong
        21
    welong  
       2022-07-04 19:35:12 +08:00
    还招人吗
    lesismal
        22
    lesismal  
       2022-07-04 19:35:53 +08:00   ❤️ 2
    直接用我出品的库吧,用 RPC 的接口方式交互,既支持普通的 HTTP RPC CALL 请求,也支持 Websocket 长连接 RPC CALL ,可以 Server 端主推送,中间件都可以定制,协议交互的各种业务类型都方便支持:
    github.com/lesismal/arpc
    web 的例子看这里:
    github.com/lesismal/arpc/tree/master/examples/webchat

    数据库也用我这个,比什么 ORM 或者其他的 RawSql 库都简单易用方便得很(隔壁帖子前阵子刚有人喷 go 的 ORM 呢):
    github.com/lesismal/sqlw
    例子看这里:
    github.com/lesismal/sqlw_examples
    前几天刚发过帖子:
    www.v2ex.com/t/861739

    不要以为 star 少不好用,那是因为做得晚、现在几个国内 go 站长都忙着卖课程挣钱所以论坛没人看了推广不起来、我也不屑于去加那些互相捧臭脚的技术饭圈,有不少项目 KPI 搞假玩意忽悠人呢、氛围太恶心

    吹个牛说,我提供的都是最强方案,如果哪位不服,来看看试用下欢迎来跟我 battle 。
    mcfog
        23
    mcfog  
       2022-07-04 19:37:09 +08:00
    要 Swagger/OpenAPI ,已选 ent 的话
    我建议 https://goa.design/

    goa + ent + uber/zap
    根据团队风格 /喜好判断是否要来个 DI 容器
    freakxx
        24
    freakxx  
       2022-07-04 19:53:10 +08:00
    gin + ent 能满足日常开发,虽然有些东西还要自己手搓,体验感还不错
    iosyyy
        25
    iosyyy  
       2022-07-04 20:06:09 +08:00 via Android
    goframe 自带 swagger 可以自动生成。。
    themiscloud
        26
    themiscloud  
       2022-07-04 20:20:42 +08:00
    ent 用着感觉非常棒
    rrfeng
        27
    rrfeng  
       2022-07-04 20:45:48 +08:00   ❤️ 3
    在看到这个帖子之前我都没听说过 goframe ,怎么突然就这么多人推荐??
    gowk
        28
    gowk  
    OP
       2022-07-04 21:05:02 +08:00
    @rrfeng 可能因为 1 楼推荐了吧 ……
    liuhan907
        29
    liuhan907  
       2022-07-04 22:18:15 +08:00 via Android
    公司内部项目,不用操心延迟和同时在线用户数量,我就不觉得会有比 blazor server 糊逻辑更快的。可惜这是微软的东西,zz 不正确(狗头
    littlehero220
        30
    littlehero220  
       2022-07-04 22:48:30 +08:00
    logrus 大量反射
    jmllx1963
        31
    jmllx1963  
       2022-07-04 22:59:24 +08:00
    用 goframe 然后用 apifox 直接导入 api 文档,对前端和维护都非常友好的框架
    dilu
        32
    dilu  
       2022-07-04 23:04:11 +08:00
    建议你搞个脚本,可以一键生成 curd 代码和前端简单的表单样式,这样后续开发速度和规范性都有很大的提高
    tairan2006
        33
    tairan2006  
       2022-07-04 23:29:10 +08:00 via Android   ❤️ 1
    Gin zap sqlbuilder+sqlx 啥框架都是浮云
    ipwx
        34
    ipwx  
       2022-07-04 23:35:19 +08:00
    @liuhan907 Python FastAPI 表示也很愉快
    ipwx
        35
    ipwx  
       2022-07-04 23:38:18 +08:00   ❤️ 1
    @liuhan907 (顺便吐槽一下 FastAPI 的 slogan

    ——最快的 Python web 框架之一
    https://fastapi.tiangolo.com/zh/

    如果说开发最快的框架之一还说不定是的。。。运行最快的,这个我不觉得它说对了。内置强类型的各种输入输出 Serialization / Deserialization 和检查,还有自动产生 Swagger 文档。async def 和 def 可以混用。配合 sqlmodel 可以直接对接 sqlalchemy 的 ORM 到 Swagger 的 JSON API 。爽爆了。

    不过公司内部项目,服务器算力都是过剩的,管这个干嘛。
    815979670
        36
    815979670  
       2022-07-04 23:52:08 +08:00
    api 文档的话 apifox 试试? 有人说用起来会卡,但强大的功能还能免费团队协作,也很诱人。
    sakishum
        37
    sakishum  
       2022-07-04 23:54:53 +08:00
    推荐 GVA (gin-vue-admin)
    charlie21
        38
    charlie21  
       2022-07-04 23:59:55 +08:00
    巴巴爸爸这头像可以
    sciel
        39
    sciel  
       2022-07-05 00:04:30 +08:00 via iPhone
    goframe +1
    liuhan907
        40
    liuhan907  
       2022-07-05 00:14:07 +08:00
    @ipwx
    sqlalchemy 和 efcore 是唯二我认为能称得上是好用的 ORM ,其它的我觉得都不怎么好用-_-
    FastAPI 糊 API 配合 sqlalchemy 确实也顺手,但是当你想写页面的时候,还是 blazor server 这种前后混合的糊起来快。只不过延迟一高就没法用了,非常遗憾。
    SteveWoo
        41
    SteveWoo  
       2022-07-05 01:06:08 +08:00   ❤️ 1
    《架构整洁之道》:深入了解业务,技术上先别管那么多,不管细节直接开撸。比如:就在 main 函数里把核心业务逻辑全实现了, 最多持久化就写个本地文件。
    ipwx
        42
    ipwx  
       2022-07-05 01:56:20 +08:00
    @liuhan907 Oh 我是全栈。

    所以我的方案是 Vue.js + Webpack <====> FastAPI + SQLModel

    SQLModel 是个神奇的东西,Thin wrapper around Pydantic + SQLAlchemy 。换句话说用一个模型定义可以同时提供 response_model 给 FastAPI ,以及给 SQLAlchemy 。当然 SQLModel 自身原语稍微受限,但是完全可以直接注入 SQLAlchemy 的东西。

    在我的实际使用中,response model 是更侧重 SQLAlchemy 而兼容 Pydantic 的写法。Request model 则是纯粹的 Pydantic 。用起来还是很爽的。
    ipwx
        43
    ipwx  
       2022-07-05 01:57:22 +08:00
    @liuhan907 而且不得不说 npm install 真的是生产力(滑稽
    licoycn
        44
    licoycn  
       2022-07-05 07:45:06 +08:00   ❤️ 3
    我是组装搭建的:

    web:github.com/gin-gonic/gin
    数据库:gorm.io/gorm
    配置:github.com/spf13/viper
    redis: https://github.com/go-redis/redis
    工具包:github.com/duke-git/lancet
    参数验证:github.com/gookit/validate
    日子:go.uber.org/zap
    json:github.com/json-iterator/go
    协程池:github.com/panjf2000/ants

    当然还有其他组件,自己组建灵活性高定制型高~
    a330202207
        45
    a330202207  
       2022-07-05 08:48:30 +08:00
    Vue 的话这俩都可以,goframe 自带 swagger ,api 文档:showdoc 挺好用,DevOps:GitLab ,项目管理:禅道或者 Jira 吧
    https://github.com/tiger1103/gfast
    https://github.com/bufanyun/hotgo
    charmToby
        46
    charmToby  
       2022-07-05 09:10:48 +08:00
    推荐 go-zero ,生态方面也慢慢再起来,作者也在及时迭代。
    文档我推荐 apidoc 集成特别方便。
    ikaros
        47
    ikaros  
       2022-07-05 09:24:05 +08:00
    新手建议 echo gin 这类就行了, 有些框架做了太多事情,隐藏了很多底层细节,出了问题排查起来很麻烦。echo 和 gin 基本都是对基础库的封装, 出了问题看源码也很快能解决。

    进阶可以试试 gokit
    fgk
        48
    fgk  
       2022-07-05 09:25:40 +08:00
    github 上面不是有个 gin Vue admin 的项目么?和你要的一样一样的,哪来就可以用了
    wangxin13g
        49
    wangxin13g  
       2022-07-05 09:55:44 +08:00
    为什么觉得 java 都写不好的换 go 写就能写好呢,用 java 抽象已经很简单了
    BBCCBB
        50
    BBCCBB  
       2022-07-05 10:07:34 +08:00
    go 写业务更惨...
    liudaolunhuibl
        51
    liudaolunhuibl  
       2022-07-05 10:19:56 +08:00
    java 还有心智负担,那你要做好用 go 随时高血压的危险,java 的优点就是很难写出烂代码,条条框框太多了
    MrSheng
        52
    MrSheng  
       2022-07-05 10:20:22 +08:00
    非官方标准布局: https://github.com/golang-standards/project-layout


    PS:
    凡是国人开发,却不提供中文 README 的请一律枪毙。
    我看的懂英文,只是不想看那些蹩脚英文。
    BeijingBaby
        53
    BeijingBaby  
       2022-07-05 10:24:00 +08:00   ❤️ 7
    我是来提反对意见的。
    不要用所谓 goframe 这种框架,这种框架看似给了你一整套解决方案,但是:
    框架集成的都是最优解吗? orm ?缓存管理?数据校验?……

    框架集成的这么多,你能用到多少?只要有一个不符合最优解或你的团队偏好,用起来就很蹩脚了。
    小项目可以用用,好处只有一个,快速开始写业务。
    能预见的可能变大的项目不建议,在某个规模(可能很快遇到)后,框架只会带来坏处,不会有好处,你所有的东西都被框架给“框”住。
    njutree
        54
    njutree  
       2022-07-05 10:31:57 +08:00
    简单看了下 goframe 和 gin 很像在 gin 之上加了很多特性, 很多功能还是很有用的. 但是感觉文档组织和写的稍微有些混乱, 软件工程的东西讲了不少, 框架相关的文档写的不是很细.
    gowk
        55
    gowk  
    OP
       2022-07-05 10:44:30 +08:00
    @tairan2006 #33
    sqlbuilder 用哪个库比较好?
    gowk
        56
    gowk  
    OP
       2022-07-05 10:45:32 +08:00
    @liuhan907 #40
    efcore 确实舒服,Go 里面跟它对标的就是 ent 了吧
    gowk
        57
    gowk  
    OP
       2022-07-05 10:49:24 +08:00
    @licoycn #44
    谢谢,值得参考
    redvoilin
        58
    redvoilin  
       2022-07-05 10:49:38 +08:00
    用 go 来写业务系统,真是没事找事的,go 设计的初衷就不是为了给你们写业务系统的吧,就国内热衷用 go 写业务系统。用 java 、ruby on rails 这些不香吗
    Cyanhall
        59
    Cyanhall  
       2022-07-05 10:54:05 +08:00
    @BeijingBaby goframe 的 ORM 感觉比不上 ent, ent 可全静态方法调用去写逻辑,不用自己手打表名、字段名,sql 。不过 goframe 的数据校验比流行的 go-playground/validator 完善很多。有参考价值。
    yazinnnn
        60
    yazinnnn  
       2022-07-05 11:05:40 +08:00   ❤️ 2
    期待两年后 op 看到 go 代码后感到 '恶心'
    liuhan907
        61
    liuhan907  
       2022-07-05 11:18:49 +08:00
    @ipwx
    但是我是纯粹的后端,写前端是为了公司内部用,所以前后分离是很麻烦的,对我来说。而且我喜欢静态强类型语言,不然团队合作真的挺难受的。
    liuhan907
        62
    liuhan907  
       2022-07-05 11:19:23 +08:00
    @gowk 我放个暴论在这,Go 根本没有能和 efcore 相比的 ORM ,提鞋都不够。
    ipwx
        63
    ipwx  
       2022-07-05 11:21:28 +08:00
    @liuhan907 2333 嘛嘛,毕竟你是纯粹后端。

    我虽然做的也是公司内部用的,但我毕竟是全栈。对我来说因为会前后端分离,所以可以用上开发速度最快的一套组合。
    gowk
        64
    gowk  
    OP
       2022-07-05 11:24:23 +08:00
    @liuhan907
    之前用 ASP.NET Core + efcore 做了好几个项目了,奈何 .NET 开发人员太难招,其实 .NET 入门也挺简单的
    C# 用起来太舒服了
    gowk
        65
    gowk  
    OP
       2022-07-05 11:26:03 +08:00
    @yazinnnn #60
    哈哈,目前来说用 Go 的感觉就一个字……爽
    gowk
        66
    gowk  
    OP
       2022-07-05 11:27:30 +08:00
    @redvoilin #58
    ror 就别提了,虽然好用但是跟 .NET 一样,招不到人
    lesismal
        67
    lesismal  
       2022-07-05 11:34:53 +08:00
    @gowk #55
    sqlw

    OP 你瞅一眼试一下,还有比我这个好用的吗。。。

    ```golang
    result, err := db.Insert("insert into sqlw_test.sqlw_test", &m)
    if err != nil {
    log.Panic(err)
    }

    result, err := db.Delete("delete from sqlw_test.sqlw_test where id=?", deleteId)
    if err != nil {
    log.Panic(err)
    }

    m := Model{
    I: 1,
    S: "str_1",
    }
    updateId := 1
    result, err := db.Update("update sqlw_test.sqlw_test set i=?, s=? where id=?", &m, updateId)
    if err != nil {
    log.Panic(err)
    }

    var model Model
    selectId := 1
    result, err := db.Select(&model, "select * from sqlw_test.sqlw_test where id=?", selectId)
    // result, err := db.SelectOne(&model, "select (i,s) from sqlw_test.sqlw_test where id=?", selectId) // select some fields
    if err != nil {
    log.Panic(err)
    }

    var models []*Model // type []Model is also fine
    result, err = db.Select(&models, "select * from sqlw_test.sqlw_test")
    // result, err = db.SelectOne(&models, "select (i,s) from sqlw_test.sqlw_test") // select some fields
    if err != nil {
    log.Panic(err)
    }
    ```
    sunwei0325
        68
    sunwei0325  
       2022-07-05 11:43:37 +08:00
    我怎么和楼主恰好相反, java 写业务代码最没有心智负担
    lesismal
        69
    lesismal  
       2022-07-05 11:45:35 +08:00
    @BeijingBaby
    非常同意,那些搞了一大套微服务的各种、或者集成 ORM 之类的,都是适合他们自家业务而已。而且很多集成别人的库的项目,说句不好听的,都不应该叫框架
    lesismal
        70
    lesismal  
       2022-07-05 12:00:03 +08:00
    @licoycn #44
    同学,求 orm 使用者试玩我的 sqlw 一下给个体验反馈。
    另外对于协程池,我这里有份 benchmark 请查收,包括标准库、ants 、字节的、我自己的库里带的,可以在自己机器上 linux 系统跑下试试不同的 cpu:

    ```sh
    # sleep 0ns
    ubuntu@ubuntu:~/test$ go test -v -bench=.
    goos: linux
    goarch: amd64
    pkg: test
    cpu: AMD Ryzen 7 5800H with Radeon Graphics
    BenchmarkGo
    BenchmarkGo-8 6322 178909 ns/op 16413 B/op 1025 allocs/op
    BenchmarkBytedanceGopool
    BenchmarkBytedanceGopool-8 2714 427975 ns/op 39506 B/op 2045 allocs/op
    BenchmarkAnts
    BenchmarkAnts-8 3746 315216 ns/op 16418 B/op 1025 allocs/op
    BenchmarkMixedPool
    BenchmarkMixedPool-8 4759 253604 ns/op 49168 B/op 3073 allocs/op
    PASS
    ok test 4.821s

    # sleep 10ns
    ubuntu@ubuntu:~/test$ go version
    go version go1.18 linux/amd64
    ubuntu@ubuntu:~/test$ go version
    go version go1.18 linux/amd64
    ubuntu@ubuntu:~/test$ lsb_release -a
    No LSB modules are available.
    Distributor ID: Ubuntu
    Description: Ubuntu 18.04.6 LTS
    Release: 18.04
    Codename: bionic
    ubuntu@ubuntu:~/test$ go test -bench=. -v
    goos: linux
    goarch: amd64
    pkg: test
    cpu: AMD Ryzen 7 5800H with Radeon Graphics
    BenchmarkGo
    BenchmarkGo-8 4406 274001 ns/op 98522 B/op 2051 allocs/op
    BenchmarkBytedanceGopool
    BenchmarkBytedanceGopool-8 2404 486601 ns/op 55419 B/op 2212 allocs/op
    BenchmarkAnts
    BenchmarkAnts-8 3147 396720 ns/op 16437 B/op 1025 allocs/op
    BenchmarkMixedPool
    BenchmarkMixedPool-8 3530 346933 ns/op 131111 B/op 4097 allocs/op
    PASS
    ok test 5.021s
    ```

    ```golang
    package test

    import (
    "sync"
    "testing"
    "time"

    "github.com/bytedance/gopkg/util/gopool"
    "github.com/lesismal/nbio/taskpool"
    "github.com/panjf2000/ants/v2"
    )

    const testLoopNum = 1024
    const sleepTime = time.Nanosecond * 0

    func BenchmarkGo(b *testing.B) {
    b.ReportAllocs()
    b.ResetTimer()

    for i := 0; i < b.N; i++ {
    wg := sync.WaitGroup{}
    wg.Add(testLoopNum)
    for j := 0; j < testLoopNum; j++ {
    go func() {
    if sleepTime > 0 {
    time.Sleep(sleepTime)
    }
    wg.Done()
    }()
    }
    wg.Wait()
    }
    }

    func BenchmarkBytedanceGopool(b *testing.B) {
    b.ReportAllocs()
    b.ResetTimer()

    for i := 0; i < b.N; i++ {
    wg := sync.WaitGroup{}
    wg.Add(testLoopNum)
    for j := 0; j < testLoopNum; j++ {
    gopool.Go(func() {
    if sleepTime > 0 {
    time.Sleep(sleepTime)
    }
    wg.Done()
    })
    }
    wg.Wait()
    }
    }

    func BenchmarkAnts(b *testing.B) {
    b.ReportAllocs()
    b.ResetTimer()

    for i := 0; i < b.N; i++ {
    wg := sync.WaitGroup{}
    wg.Add(testLoopNum)
    for j := 0; j < testLoopNum; j++ {
    ants.Submit(func() {
    if sleepTime > 0 {
    time.Sleep(sleepTime)
    }
    wg.Done()
    })
    }
    wg.Wait()
    }
    }

    func BenchmarkMixedPool(b *testing.B) {
    p := taskpool.NewMixedPool(1024*4, 1, 1024)
    defer p.Stop()

    b.ReportAllocs()
    b.ResetTimer()

    for i := 0; i < b.N; i++ {
    wg := sync.WaitGroup{}
    wg.Add(testLoopNum)
    for j := 0; j < testLoopNum; j++ {
    p.Go(func() {
    if sleepTime > 0 {
    time.Sleep(sleepTime)
    }
    wg.Done()
    })
    }
    wg.Wait()
    }
    }
    ```
    liuhan907
        71
    liuhan907  
       2022-07-05 12:25:37 +08:00   ❤️ 1
    @ipwx @gowk
    其实是因为我们是游戏公司,写 web 只是因为运维和运营需要一个平台看数据,这种在线人数 <=1 qps=0.01 的东西,肯定是用最快的方式糊出来就行。efcore 配 blazor server 糊管理平台这种东西,别提多快了。vue3 配合 ts 虽然也不错但是我不是专职前端,写 ts 和 css 还是不如直接 razor 糊顺手。
    tairan2006
        72
    tairan2006  
       2022-07-05 12:55:03 +08:00
    xingjue
        73
    xingjue  
       2022-07-05 12:55:36 +08:00
    建议 go-zero
    redvoilin
        74
    redvoilin  
       2022-07-05 13:08:09 +08:00
    @gowk 用 ror 开发,也不用几个人员吧,就是用 java 写业务也比 go 好
    zhaojiaxing
        75
    zhaojiaxing  
       2022-07-05 13:12:32 +08:00
    ent 生成的文件太多了……
    IIInsomnia
        76
    IIInsomnia  
       2022-07-05 14:09:07 +08:00
    Goframe 太重了,可以参考下: https://github.com/shenghui0779/tplgo ,采用轻量的 yiigo
    yrj
        77
    yrj  
       2022-07-05 14:11:19 +08:00
    好像没人推荐,我来安利一下 gofiber
    newghost
        78
    newghost  
       2022-07-05 14:14:51 +08:00
    感觉 rust 比 go 有前途
    hoopan
        79
    hoopan  
       2022-07-05 14:19:57 +08:00
    之前用 gin + gorm 自己搭过一套 web 框架,感觉 go 使用包管理的方式,需要什么组件引入就好了。
    349865361
        80
    349865361  
       2022-07-05 14:20:59 +08:00
    gin fiber echo 都用过,推荐 echo
    Baloneo
        81
    Baloneo  
       2022-07-05 14:22:24 +08:00
    Flask+ApiFox+Peewee
    betainCao
        82
    betainCao  
       2022-07-05 15:06:21 +08:00
    gin+gorm 就够用了,api 接口 swagger 就不错,直接上 gitops 不香吗? GitHub action 这类的,cicd 都可以搞。
    timothyye
        83
    timothyye  
       2022-07-05 16:09:46 +08:00
    @njutree 同感
    encro
        84
    encro  
       2022-07-05 16:50:53 +08:00
    rust + axum + sea-orm
    sophos
        85
    sophos  
       2022-07-05 17:31:31 +08:00
    nicktogo
        86
    nicktogo  
       2022-07-05 18:20:56 +08:00 via iPhone
    等下... 虽然谷歌招人标准有待讨论,是不是得了解下,谷歌招的毕业生和楼主你招的毕业生是不是一个类型,谷歌能提供的资源和楼主能提供的是不是相当?
    sardina
        87
    sardina  
       2022-07-05 18:54:37 +08:00
    不要用那种组合怪产品
    JakeZou
        88
    JakeZou  
       2022-07-05 19:46:17 +08:00 via iPhone
    我来推荐一个 iris
    gowk
        89
    gowk  
    OP
       2022-07-05 20:40:07 +08:00
    @nicktogo #86
    引用这段话的意思是 Go 语言对新人比较友好,没别的意思,不要过度引申
    INCerry
        90
    INCerry  
       2022-07-05 22:46:02 +08:00
    总的来说,Go 不适合写业务系统,如果只写过 Go 可能会觉得我说的是错的,一旦你用过 Java 、C#甚至 Node.Js 都会觉得 Go 写业务系统就是体验降级。
    zyxbcde808
        91
    zyxbcde808  
       2022-07-06 00:53:13 +08:00 via Android
    @ipwx 可以看看 tortoise-orm ,sqlalchemy 异步手感奇差,比以前差远了。这个框架无论手撸 sql 还是 orm 模式都没啥心智负担。
    ipwx
        92
    ipwx  
       2022-07-06 01:31:03 +08:00   ❤️ 1
    @zyxbcde808 虽然 sqlalchemy 手感差,但是这段时间写项目,无论什么奇葩的需求我都找到了解决方案。。。

    比如我虽然用了 ORM 但是其实是绑定到 PostgreSQL 的。比如我开了个 ARRAY[ForeignKey[UUID]] 的字段,并且要求建立数组中每个元素的索引。。。。SQLAlchemy 也能支持我这么搞,这就很 nice 了。

    而且通过 SQLModel + FastAPI 我能直接把一个 ORM Class (包含了 UUID date List[ORMModel] 这类复杂的类型)暴露给 JSON API 的 Schema ,在 Swagger 里面能产生文档,这也很爽。
    ipwx
        93
    ipwx  
       2022-07-06 01:32:24 +08:00
    p.s. 那个 ARRAY[ForeignKey[UUID]] 字段其实是某种 object 的 children 字段,引用了另一个表的元素。

    另外我还用 ARRAY[str] 索引了 object 的 tag 。在 sqlalchemy 里面查询可以写作

    Table.tags.contains([tag])
    dcoder
        94
    dcoder  
       2022-07-06 08:27:49 +08:00
    个人感觉写 Java 是不如写 Go 舒服,
    但是你 "大爱 if err != nil ?" 楼主你是认真的么? 还是抖 M ?
    lesismal
        95
    lesismal  
       2022-07-06 10:43:03 +08:00
    得嘞,明珠暗投,祝 OP 好运
    a15757817542
        96
    a15757817542  
       2022-07-06 10:56:25 +08:00
    如果你们写不好 java 对话,go 也是写不好的,这是我的认知
    pastor
        97
    pastor  
       2022-07-06 13:02:06 +08:00
    基于标准库的 echo 比 gin 看着舒服多了,基于 fasthttp 的 fiber 不错
    leiuu
        98
    leiuu  
       2022-07-06 13:11:51 +08:00
    golang 和 java 都在用,java 用的多些。
    想稍微反驳下楼主。

    1. 为什么用 java 写不好的业务代码的同学,用 golang 可以写好,有没有具体的例子
    2. golang 没有继承和面向对象? 这个和语言关系不大吧 要说 shell 没有面向对象我倒能理解 高级语言基本是支持多泛式编程
    3. java 一样好上手 有 golang 背景或者有 java 背景的互转 我估计 1-3 天基础上手问题不大
    4. 至于你提到的 golang 的辅助库、1.18 上了泛型等 相比 java 库的丰富度来说不值一提哈哈

    综上,个人观点,小项目用啥语言其实都行,用团队不熟悉言准备好踩坑。
    中大型的业务开发类的项目,还是慎用 golang ,例如你可能会和数十种组件进行交互。
    这点来说,java 虽有弊端但他的生态兼容性几乎是最好的。
    coolair
        99
    coolair  
       2022-07-06 16:01:11 +08:00
    楼主慎重,你用 goframe ,还不如去用 java 的 springboot 。
    crazycarry
        100
    crazycarry  
       2022-07-06 17:13:57 +08:00
    spring boot,应届生三天就给我干活,,不要理解,照着抄。抄错自己滚
    1  2  
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5985 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 44ms · UTC 03:17 · PVG 11:17 · LAX 19:17 · JFK 22:17
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.