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

2022-07-04 17:45:32 +08:00
 gowk

对于 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 ,想请教大家两个问题:

13667 次点击
所在节点    程序员
107 条回复
liuhan907
2022-07-05 11:18:49 +08:00
@ipwx
但是我是纯粹的后端,写前端是为了公司内部用,所以前后分离是很麻烦的,对我来说。而且我喜欢静态强类型语言,不然团队合作真的挺难受的。
liuhan907
2022-07-05 11:19:23 +08:00
@gowk 我放个暴论在这,Go 根本没有能和 efcore 相比的 ORM ,提鞋都不够。
ipwx
2022-07-05 11:21:28 +08:00
@liuhan907 2333 嘛嘛,毕竟你是纯粹后端。

我虽然做的也是公司内部用的,但我毕竟是全栈。对我来说因为会前后端分离,所以可以用上开发速度最快的一套组合。
gowk
2022-07-05 11:24:23 +08:00
@liuhan907
之前用 ASP.NET Core + efcore 做了好几个项目了,奈何 .NET 开发人员太难招,其实 .NET 入门也挺简单的
C# 用起来太舒服了
gowk
2022-07-05 11:26:03 +08:00
@yazinnnn #60
哈哈,目前来说用 Go 的感觉就一个字……爽
gowk
2022-07-05 11:27:30 +08:00
@redvoilin #58
ror 就别提了,虽然好用但是跟 .NET 一样,招不到人
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
2022-07-05 11:43:37 +08:00
我怎么和楼主恰好相反, java 写业务代码最没有心智负担
lesismal
2022-07-05 11:45:35 +08:00
@BeijingBaby
非常同意,那些搞了一大套微服务的各种、或者集成 ORM 之类的,都是适合他们自家业务而已。而且很多集成别人的库的项目,说句不好听的,都不应该叫框架
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
2022-07-05 12:25:37 +08:00
@ipwx @gowk
其实是因为我们是游戏公司,写 web 只是因为运维和运营需要一个平台看数据,这种在线人数 <=1 qps=0.01 的东西,肯定是用最快的方式糊出来就行。efcore 配 blazor server 糊管理平台这种东西,别提多快了。vue3 配合 ts 虽然也不错但是我不是专职前端,写 ts 和 css 还是不如直接 razor 糊顺手。
tairan2006
2022-07-05 12:55:03 +08:00
xingjue
2022-07-05 12:55:36 +08:00
建议 go-zero
redvoilin
2022-07-05 13:08:09 +08:00
@gowk 用 ror 开发,也不用几个人员吧,就是用 java 写业务也比 go 好
zhaojiaxing
2022-07-05 13:12:32 +08:00
ent 生成的文件太多了……
IIInsomnia
2022-07-05 14:09:07 +08:00
Goframe 太重了,可以参考下: https://github.com/shenghui0779/tplgo ,采用轻量的 yiigo
yrj
2022-07-05 14:11:19 +08:00
好像没人推荐,我来安利一下 gofiber
newghost
2022-07-05 14:14:51 +08:00
感觉 rust 比 go 有前途
hoopan
2022-07-05 14:19:57 +08:00
之前用 gin + gorm 自己搭过一套 web 框架,感觉 go 使用包管理的方式,需要什么组件引入就好了。
349865361
2022-07-05 14:20:59 +08:00
gin fiber echo 都用过,推荐 echo

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/864023

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX