对于 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 语言的原因
因为是公司内部业务系统,没必要上微服务,且前端打算使用 Vue 2|3 ,想请教大家两个问题:
1
a330202207 2022-07-04 17:47:58 +08:00 1
goframe 吧
|
2
fzdwx 2022-07-04 17:48:57 +08:00
还招人吗,github.com/fzdwx 需要简历吗?
|
3
TWorldIsNButThis 2022-07-04 17:52:23 +08:00 via iPhone 2
那我建议 ts 后端
|
4
yunxi 2022-07-04 17:53:03 +08:00
go 确实还是比较不错的,写一下具体选型把:
http 框架: gin (使用比较广泛,目前没有发现问题) ORM : gorm (使用简单,易上手,使用比较广泛) 日志:logrus ... 其他楼主可以自行 google ,找一些大家常用的包即可。 项目分层,可以看看我之前写的一片文章 https://www.artacode.com/post/golang/template/ |
5
dqzcwxb 2022-07-04 17:53:36 +08:00 1
"但是我觉得写好并不容易,尤其是对一些刚毕业开发经验少的同学来说。"-这句话是用初学者的角度评价 java
"有其他语言背景可以快速上手"-这里是想要有工作经验和一门语言的程序员,至少不是初学者 |
6
mekingname 2022-07-04 17:56:15 +08:00
试一试用两天 gin-vue-admin ,如果你用这个项目用起来很顺手的话,那么后端选型就很容易了,直接 gin.
|
7
gowk OP |
9
gowk OP @TWorldIsNButThis #3
ts 能比 Go 好写? |
11
voidmnwzp 2022-07-04 18:19:26 +08:00 via iPhone
放心 泛型不会大规模使用 这几年内
|
12
iosyyy 2022-07-04 18:21:49 +08:00 via Android
建议直接 goframe 其他的要配一大堆东西才能算一个项目
|
13
iwdmb 2022-07-04 18:24:52 +08:00
内部系统 GoFrame +1
|
14
helone 2022-07-04 18:25:53 +08:00 2
gofiber + entgo
|
15
wzw 2022-07-04 18:28:37 +08:00
GoFrame + 1 (gin 和 GoFrame, 我选了 GoFrame, 简单易用+够用)
|
16
Gota 2022-07-04 18:33:02 +08:00
刚上手建议用比较轻量级的框架,比如 https://github.com/go-chi/chi
项目结构可以参考我之前写的一篇博客: https://blog.igota.net/posts/20220422/ |
17
bigbigpark 2022-07-04 18:45:16 +08:00
想省心上 GoFrame 吧
|
18
hLc1 2022-07-04 19:19:49 +08:00 via Android
ts 后端也没问题,ts 的 nestjs 框架不同风格的 orm 就提供了 4 种,框架大而全。
|
19
hLc1 2022-07-04 19:23:34 +08:00 via Android
之前知乎上有个团队用 nestjs 写游戏,80w 行代码游戏的项目毫无压力。
|
20
brucedone 2022-07-04 19:29:54 +08:00
goframe , 解决 orm , 常用轮子,分层,等常见问题
|
21
welong 2022-07-04 19:35:12 +08:00
还招人吗
|
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 。 |
23
mcfog 2022-07-04 19:37:09 +08:00
要 Swagger/OpenAPI ,已选 ent 的话
我建议 https://goa.design/ goa + ent + uber/zap 根据团队风格 /喜好判断是否要来个 DI 容器 |
24
freakxx 2022-07-04 19:53:10 +08:00
gin + ent 能满足日常开发,虽然有些东西还要自己手搓,体验感还不错
|
25
iosyyy 2022-07-04 20:06:09 +08:00 via Android
goframe 自带 swagger 可以自动生成。。
|
26
themiscloud 2022-07-04 20:20:42 +08:00
ent 用着感觉非常棒
|
27
rrfeng 2022-07-04 20:45:48 +08:00 3
在看到这个帖子之前我都没听说过 goframe ,怎么突然就这么多人推荐??
|
29
liuhan907 2022-07-04 22:18:15 +08:00 via Android
公司内部项目,不用操心延迟和同时在线用户数量,我就不觉得会有比 blazor server 糊逻辑更快的。可惜这是微软的东西,zz 不正确(狗头
|
30
littlehero220 2022-07-04 22:48:30 +08:00
logrus 大量反射
|
31
jmllx1963 2022-07-04 22:59:24 +08:00
用 goframe 然后用 apifox 直接导入 api 文档,对前端和维护都非常友好的框架
|
32
dilu 2022-07-04 23:04:11 +08:00
建议你搞个脚本,可以一键生成 curd 代码和前端简单的表单样式,这样后续开发速度和规范性都有很大的提高
|
33
tairan2006 2022-07-04 23:29:10 +08:00 via Android 1
Gin zap sqlbuilder+sqlx 啥框架都是浮云
|
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 。爽爆了。 不过公司内部项目,服务器算力都是过剩的,管这个干嘛。 |
36
815979670 2022-07-04 23:52:08 +08:00
api 文档的话 apifox 试试? 有人说用起来会卡,但强大的功能还能免费团队协作,也很诱人。
|
37
sakishum 2022-07-04 23:54:53 +08:00
推荐 GVA (gin-vue-admin)
|
38
charlie21 2022-07-04 23:59:55 +08:00
巴巴爸爸这头像可以
|
39
sciel 2022-07-05 00:04:30 +08:00 via iPhone
goframe +1
|
40
liuhan907 2022-07-05 00:14:07 +08:00
@ipwx
sqlalchemy 和 efcore 是唯二我认为能称得上是好用的 ORM ,其它的我觉得都不怎么好用-_- FastAPI 糊 API 配合 sqlalchemy 确实也顺手,但是当你想写页面的时候,还是 blazor server 这种前后混合的糊起来快。只不过延迟一高就没法用了,非常遗憾。 |
41
SteveWoo 2022-07-05 01:06:08 +08:00 1
《架构整洁之道》:深入了解业务,技术上先别管那么多,不管细节直接开撸。比如:就在 main 函数里把核心业务逻辑全实现了, 最多持久化就写个本地文件。
|
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 。用起来还是很爽的。 |
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 当然还有其他组件,自己组建灵活性高定制型高~ |
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 |
46
charmToby 2022-07-05 09:10:48 +08:00
推荐 go-zero ,生态方面也慢慢再起来,作者也在及时迭代。
文档我推荐 apidoc 集成特别方便。 |
47
ikaros 2022-07-05 09:24:05 +08:00
新手建议 echo gin 这类就行了, 有些框架做了太多事情,隐藏了很多底层细节,出了问题排查起来很麻烦。echo 和 gin 基本都是对基础库的封装, 出了问题看源码也很快能解决。
进阶可以试试 gokit |
48
fgk 2022-07-05 09:25:40 +08:00
github 上面不是有个 gin Vue admin 的项目么?和你要的一样一样的,哪来就可以用了
|
49
wangxin13g 2022-07-05 09:55:44 +08:00
为什么觉得 java 都写不好的换 go 写就能写好呢,用 java 抽象已经很简单了
|
50
BBCCBB 2022-07-05 10:07:34 +08:00
go 写业务更惨...
|
51
liudaolunhuibl 2022-07-05 10:19:56 +08:00
java 还有心智负担,那你要做好用 go 随时高血压的危险,java 的优点就是很难写出烂代码,条条框框太多了
|
52
MrSheng 2022-07-05 10:20:22 +08:00
非官方标准布局: https://github.com/golang-standards/project-layout
PS: 凡是国人开发,却不提供中文 README 的请一律枪毙。 我看的懂英文,只是不想看那些蹩脚英文。 |
53
BeijingBaby 2022-07-05 10:24:00 +08:00 7
我是来提反对意见的。
不要用所谓 goframe 这种框架,这种框架看似给了你一整套解决方案,但是: 框架集成的都是最优解吗? orm ?缓存管理?数据校验?…… 框架集成的这么多,你能用到多少?只要有一个不符合最优解或你的团队偏好,用起来就很蹩脚了。 小项目可以用用,好处只有一个,快速开始写业务。 能预见的可能变大的项目不建议,在某个规模(可能很快遇到)后,框架只会带来坏处,不会有好处,你所有的东西都被框架给“框”住。 |
54
njutree 2022-07-05 10:31:57 +08:00
简单看了下 goframe 和 gin 很像在 gin 之上加了很多特性, 很多功能还是很有用的. 但是感觉文档组织和写的稍微有些混乱, 软件工程的东西讲了不少, 框架相关的文档写的不是很细.
|
55
gowk OP @tairan2006 #33
sqlbuilder 用哪个库比较好? |
58
redvoilin 2022-07-05 10:49:38 +08:00
用 go 来写业务系统,真是没事找事的,go 设计的初衷就不是为了给你们写业务系统的吧,就国内热衷用 go 写业务系统。用 java 、ruby on rails 这些不香吗
|
59
Cyanhall 2022-07-05 10:54:05 +08:00
@BeijingBaby goframe 的 ORM 感觉比不上 ent, ent 可全静态方法调用去写逻辑,不用自己手打表名、字段名,sql 。不过 goframe 的数据校验比流行的 go-playground/validator 完善很多。有参考价值。
|
60
yazinnnn 2022-07-05 11:05:40 +08:00 2
期待两年后 op 看到 go 代码后感到 '恶心'
|
61
liuhan907 2022-07-05 11:18:49 +08:00
@ipwx
但是我是纯粹的后端,写前端是为了公司内部用,所以前后分离是很麻烦的,对我来说。而且我喜欢静态强类型语言,不然团队合作真的挺难受的。 |
63
ipwx 2022-07-05 11:21:28 +08:00
|
64
gowk OP |
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) } ``` |
68
sunwei0325 2022-07-05 11:43:37 +08:00
我怎么和楼主恰好相反, java 写业务代码最没有心智负担
|
69
lesismal 2022-07-05 11:45:35 +08:00
@BeijingBaby
非常同意,那些搞了一大套微服务的各种、或者集成 ORM 之类的,都是适合他们自家业务而已。而且很多集成别人的库的项目,说句不好听的,都不应该叫框架 |
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() } } ``` |
71
liuhan907 2022-07-05 12:25:37 +08:00 1
|
72
tairan2006 2022-07-05 12:55:03 +08:00
|
73
xingjue 2022-07-05 12:55:36 +08:00
建议 go-zero
|
75
zhaojiaxing 2022-07-05 13:12:32 +08:00
ent 生成的文件太多了……
|
76
IIInsomnia 2022-07-05 14:09:07 +08:00
Goframe 太重了,可以参考下: https://github.com/shenghui0779/tplgo ,采用轻量的 yiigo
|
77
yrj 2022-07-05 14:11:19 +08:00
好像没人推荐,我来安利一下 gofiber
|
78
newghost 2022-07-05 14:14:51 +08:00
感觉 rust 比 go 有前途
|
79
hoopan 2022-07-05 14:19:57 +08:00
之前用 gin + gorm 自己搭过一套 web 框架,感觉 go 使用包管理的方式,需要什么组件引入就好了。
|
80
349865361 2022-07-05 14:20:59 +08:00
gin fiber echo 都用过,推荐 echo
|
81
Baloneo 2022-07-05 14:22:24 +08:00
Flask+ApiFox+Peewee
|
82
betainCao 2022-07-05 15:06:21 +08:00
gin+gorm 就够用了,api 接口 swagger 就不错,直接上 gitops 不香吗? GitHub action 这类的,cicd 都可以搞。
|
84
encro 2022-07-05 16:50:53 +08:00
rust + axum + sea-orm
|
85
sophos 2022-07-05 17:31:31 +08:00
|
86
nicktogo 2022-07-05 18:20:56 +08:00 via iPhone
等下... 虽然谷歌招人标准有待讨论,是不是得了解下,谷歌招的毕业生和楼主你招的毕业生是不是一个类型,谷歌能提供的资源和楼主能提供的是不是相当?
|
87
sardina 2022-07-05 18:54:37 +08:00
不要用那种组合怪产品
|
88
JakeZou 2022-07-05 19:46:17 +08:00 via iPhone
我来推荐一个 iris
|
90
INCerry 2022-07-05 22:46:02 +08:00
总的来说,Go 不适合写业务系统,如果只写过 Go 可能会觉得我说的是错的,一旦你用过 Java 、C#甚至 Node.Js 都会觉得 Go 写业务系统就是体验降级。
|
91
zyxbcde808 2022-07-06 00:53:13 +08:00 via Android
@ipwx 可以看看 tortoise-orm ,sqlalchemy 异步手感奇差,比以前差远了。这个框架无论手撸 sql 还是 orm 模式都没啥心智负担。
|
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 里面能产生文档,这也很爽。 |
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]) |
94
dcoder 2022-07-06 08:27:49 +08:00
个人感觉写 Java 是不如写 Go 舒服,
但是你 "大爱 if err != nil ?" 楼主你是认真的么? 还是抖 M ? |
95
lesismal 2022-07-06 10:43:03 +08:00
得嘞,明珠暗投,祝 OP 好运
|
96
a15757817542 2022-07-06 10:56:25 +08:00
如果你们写不好 java 对话,go 也是写不好的,这是我的认知
|
97
pastor 2022-07-06 13:02:06 +08:00
基于标准库的 echo 比 gin 看着舒服多了,基于 fasthttp 的 fiber 不错
|
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 虽有弊端但他的生态兼容性几乎是最好的。 |
99
coolair 2022-07-06 16:01:11 +08:00
楼主慎重,你用 goframe ,还不如去用 java 的 springboot 。
|
100
crazycarry 2022-07-06 17:13:57 +08:00
spring boot,应届生三天就给我干活,,不要理解,照着抄。抄错自己滚
|