说 Go 语言写不了业务逻辑的请进
source link: https://www.v2ex.com/t/871389
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
并不打算引战,单纯出于好奇。
https://github.com/gin-gonic/gin
https://github.com/beego/beego
https://github.com/labstack/echo
把前几名的 Go 语言后端框架加一起都 10 万星了。
https://github.com/spring-projects/spring-boot
https://github.com/laravel/laravel
Gin 6 万 1 ,spring-boot 6 万 2 ,laravel 7 万。
虽然不能说明一且,但至少说明很多人在用。
首先强类型语言灵活性肯定是不如脚本语言的,所以没必要争个高低,PHP 、Node.js 、Python 这类脚本语言写业务逻辑能力是最强的。
但在可维护性上,强类型语言是比脚本语言好很多,所以 Typescript 的可维护性是远胜于 Javascript 的。
回到 Go 语言,
首先要明确的是 Go 语言是一种为了最大化编译速度而牺牲语言特性的一种语言。
很多人说 Go 语言写起来痛苦,说的其实是那些理应支持的语法糖或工具函数在 Go 语言里并不提供,而需要自己去写所带来的痛苦。不提供不意味着无法实现,只是让你用最基础的语法结构去实现,换来的是更快的编译速度和非常低的阅读门槛。
对于 if err != nil 只说一句,Error 是一种值。
https://go.dev/blog/errors-are-values
(过去也有人提议加入 Try Catch ,但都被否决了)
最后,还是要看你的需求是什么,Go 语言写业务逻辑可能不是最佳选择,但确实很多人在用 Go 写业务逻辑,它的特性满足了一些人的需求,特别是在云原生领域。
说写不了的,可以把你的场景细节分享出来,
解决方案都是有的,接不接受是每个人自己的选择,但是光说 Go 语言写不了业务逻辑,又不说到底是什么场景。
谁能知道到底是 Go 语言写不了业务逻辑,还是你的编码或理解能力上有不足呢?
luob 20 小时 42 分钟前 29 冷知识,( )也是能吃的
但是作为一个灵长类人科人属人种生物,实在没必要花大力气证明这件事,要不然会让大家怀疑你的身份。 |
yedanten 20 小时 40 分钟前 via Android 15 写不了业务 x
写 curd 很痛苦√ 如果把写业务=写 web 应用,那确实可以说,不建议 |
tairan2006 20 小时 39 分钟前 11 能用和好用不是一个概念,用 C/汇编啥都能搓出来。
golang 在复杂业务这块生态缺失是很显然的,你连个好用的工作流引擎都找不到吧。 |
BBCCBB 20 小时 36 分钟前 c++也可以写 web, 但能用和好用是有区别的
|
BeautifulSoap 20 小时 25 分钟前 3 其他感觉还好,但 Go 写 Entity 到 DTO 之类的转换写到吐血是真的
|
wangyzj 20 小时 23 分钟前 |
neteroster 20 小时 22 分钟前 3 没人说写不了吧,都是图灵完备的啥业务逻辑不能写?关键是能写和能写得好,能写得快,能写出可读性高和可维护性好的代码中间是有距离的。
|
Hanggi 20 小时 18 分钟前 @BeautifulSoap 一个结构体,定义好 tag ,一行映射不就解决了吗?
|
Hanggi 20 小时 16 分钟前 |
Hanggi 20 小时 13 分钟前 |
yuk1no 20 小时 11 分钟前 via iPhone 2 流量密码行哇
|
Curtion 20 小时 8 分钟前 不是在说写不了吧,任何一个图灵完备的编程语言只要想写都能写业务,只是区别在于合不合适。 说 Go 不适合是相较于其它的解决方案来说的。 至于说写不了的人,那肯定是乱说的,Go 是有一些特殊业务领域比较好用。
|
tairan2006 20 小时 6 分钟前 3 |
lix7 20 小时 5 分钟前 3 开头说不打算引战,最后人身攻击,可以,block 了
|
Mexion 19 小时 59 分钟前 3 有人说过不能写吗,不都是说写的很痛苦吗?这么说 c 语言也可以写啊,为什么不用 C 语言写
|
fkdog 19 小时 55 分钟前 4 问一下,还花时间在编程语言这个级别上 battle 的,一般都是毕业几年的啊?
|
XCFOX 19 小时 55 分钟前 5 我个人感触比较深的是 ORM 场景。C# 有 Entity Framework 、TypeScript 有 TypeORM 、MikroORM 、PHP 有 Eloquent 、Kotlin 的 Ktorm 。看过了以上 ORM 再看 Go 的 ORM 实践就很一言难尽。
优雅的 ORM(TypeORM)是这样的: ``` const article = await articleRepository.findOne({ title:"Tales of Ten Worlds",published:true }); ``` 从 文字表里取一篇文章,取出来的变量直接从 findOne() 函数里传出来,非常顺畅。 Go (gorm) 语言是这样的: ``` var article Article db.Where(&Article{Title: "Tales of Ten Worlds", Published: true}).First(&article) ``` 先声明 article 为 Article ,再传指针到 First() 里,一下子打破了函数式编程的 「没有"副作用"」「不修改状态」的教条,这里将 article 的类型改为其他也不会有编译时错误。 或者这样(ent)的: ``` article :=client.Article.Query(). Where(article.TitleEQ("Tales of Ten Worlds"),article.PublishedEQ(true)).Limit(1) ``` 这样确保了编译时类型安全但将查询条件改成了指令式的罗列,极大损失了简洁性。 |
agdhole 19 小时 51 分钟前 楼上提到了 ef core ,底层用 linq 去操作 sql 或者 list 等等,体验好太多了
|
FreeEx 19 小时 49 分钟前 我感觉主要是因为写 web 应用没有一个最佳实践出来,写起来比较痛苦,尤其是新人进入团队去改之前的代码。
例如 目录结构怎么划分? 是搞全局函数还是结构体挂方法?结构体挂方法的话如何实例化?结构体直接有依赖关系怎么实例化? db 是全局的还是通过参数传递? 需不需要分层 ApiHandler 、Service 、Repo ? ... 问题太多了,不说每一个公司吧,就说每一个项目,都可能是不同的项目结构,百花齐放,I am happy :) |
wonderfulcxm 19 小时 47 分钟前 via iPhone 6 > 很多人说 Go 语言写起来痛苦,说的其实是那些理应支持的语法糖或工具函数在 Go 语言里并不提供,而需要自己去写所带来的痛苦。不提供不意味着无法实现,只是让你用最基础的语法结构去实现。换来的是更快的编译速度和非常低的阅读门槛。
恭喜你找到了痛苦之源,而且你那么痛苦实现的功能,人家语言就自带了,质量还更好,你说气不气人吧,如果喜欢自虐,欢迎使用 go 语言。 |
coderluan 19 小时 47 分钟前 正文写的挺好,怎么起了这么个烂标题。
|
charmToby 19 小时 46 分钟前 语言之争有没有尽头。
|
nine 19 小时 35 分钟前 想用你就用呗。
至于 Star 的数量问题。你可以搜一下,什么叫“劣币驱逐良币”。 你觉得 10 块钱的冰淇淋币 2 块钱的好吃,可能是因为你压根没有听说过有 100 块钱的。 |
Mrun 19 小时 29 分钟前 |
q1angch0u 19 小时 28 分钟前 我的编码或理解能力上有不足。
|
musi 19 小时 25 分钟前 这都能骂起来,还是前端好,只能运行 JavaScript
|
RubyJack 19 小时 25 分钟前 javaboy 马上赶到战场
|
Oktfolio 19 小时 24 分钟前 第 1 点,因为 go 使用 github 作为依赖仓库,所以 repo 的 star 数普遍偏高。
go web 框架普遍使用 :param 作为路径参数([API design guide - Google Cloud]( https://cloud.google.com/apis/design/custom_methods)),比如你上面说的 gin ,所以我 star 了 gin 但不用它。 |
Leviathann 19 小时 23 分钟前 @XCFOX 这么看起来这个 gorm 好野鸡啊,连最基本的类型安全都没了,而 ent 做为 FP 大厂的作品观感上就强不少,不愧是创造了 react 的公司
|
Morii 19 小时 15 分钟前 写不了 = 考虑效率 、心智负担后,不选择 go
在这个为前提上讨论,我觉得没问题呀 如果是 crud boy 的话,不选择 go 我觉得没问题。。 |
Morii 19 小时 10 分钟前 2 >>> 很多人说 Go 语言写起来痛苦,说的其实是那些理应支持的语法糖或工具函数在 Go 语言里并不提供,而需要自己去写所带来的痛苦。不提供不意味着无法实现,只是让你用最基础的语法结构去实现。换来的是更快的编译速度和非常低的阅读门槛。
这点真的有人赞同吗? 接手一个项目还要去看前人封装的数据结构。以及对应的 api ,换一家公司还要重新熟悉 |
lvluo200711 19 小时 4 分钟前 我写 go 跟写 php 一样,平时就 curd 多,现在一年下来了,内部积累的代码有时候可能比 php 还快了。
贴一段 go 代码, 有差别吗 ~~~~ // 读取列表数据 select * from users where id > 1 and create_ed >= now() limit 16 users := NewOrmUsers().WhereIdGt(1).WhereCreatedAtGte(database.Now()).Limit(15).Get() fmt.Println(users) ~~~~ https://github.com/go-home-admin/go-admin/blob/main/app/entity/demo/user_test.go |
dqzcwxb 19 小时 4 分钟前 @tairan2006 #13 我只想说,暴露 go 吹本质了
"你不吹 go,go 吹就骂你" |
fournoas 19 小时 3 分钟前 “又不是不能用”
|
TWorldIsNButThis 19 小时 3 分钟前 via iPhone 1 没有便捷语法或被广泛采用的库的支持,那么在实际上的业务开发里基本就等于没有这个功能
|
kindjeff 19 小时 2 分钟前 新的风暴已经出现
|
ufan0 18 小时 57 分钟前 我还在上大学的时候看到部分公司开始使用 go 进行编写基础组件,感觉挺不错的。
毕业后开始参加工作接触到金融业务复杂系统,就这,想不懂为什么用 go ,kpi or okr boy ? |
mxT52CRuqR6o5 18 小时 53 分钟前 反向推销可还行
|
arischow 18 小时 51 分钟前 啊,比 star ?
|
icyalala 18 小时 49 分钟前 @Hanggi 这么说用 C 写业务逻辑也有啊: https://facil.io/ ,把帖子里的 Go 换成 C 看看?
|
litguy 18 小时 48 分钟前 1 这明显胡说八道了,不是说写不了,是写起来不 happy
我们的产品是用 C++ 写 web 的 上家公司是 C 写 web 不是不能写,是工作量明显高于那些 web 专用语言 |
KaynW 18 小时 48 分钟前 3 又到了我最喜欢的语言大战环节
|
tobepro 18 小时 47 分钟前 2 Go 真要适合,你就不会来这么努力去证明了。有这精力还是好好去贡献点代码把,为 Go 社区做点贡献。到了真正强大的时候,不用你辩解大家也都会认为 Go 可以写复杂业务逻辑了。
|
blless 18 小时 46 分钟前 @Morii #31 对公司而言,人力也是资源,也是流动的。接手一个项目本来就要熟悉之前的封装,除非你一直都只写最基础的业务。别人经验我不清楚,但是 Go 的门槛确实低,基本上业务层面上封装概念搞懂就行。拿 Python 举例,我见过比较恶心的一些例子,使用类似 flask 的 requst 绑定线程的变量,数据结构全程动态生成,一些自定义的装饰器,locals()获取当前变量名当作 key/value ,诸如此类等等等等。每次碰到这些东西,我就觉得 Go 设计太特么好了
|
nash 18 小时 37 分钟前 真正的工程师是从来不屑争论这种话题的
|
FightPig 18 小时 30 分钟前 1 只要你喜欢,用汇编都没人管。我 rails 用的爽的,干嘛找虐用 go 来写,后面并发也没到那个程度。我用 go 写的最多的是小工具,web 自己写了一套生成工具,主要用来写个 cms ,给别人用的
|
LeegoYih 18 小时 29 分钟前 1 有点饭圈的味道了
|
storyxc 18 小时 19 分钟前 |
seaiaddca 18 小时 15 分钟前 2 钱没赚几个 代码没写几行 吵架倒是一流
|
victor 18 小时 12 分钟前 1 star 数量能代表啥?中文资料收集类的 repo ,star 上万的有好多个。
|
Hanggi 18 小时 2 分钟前 @tairan2006
@lix7 @Mexion 答非所问,所以追问而已,如果觉得有攻击性,那我先说声抱歉了。 我也说了,不管是痛苦还是什么,把场景说出来,分享一下。 不是说我要去评判,而是分享出来,大家探讨一下。 说人身攻击是指“编写的人的问题呢?”这句话吗? 代码的质量跟编写的人经验和习惯相关(也跟项目进度等很多因素相关), 如果用 PHP 老手和 Go 语言新手写出来的代码比较可读性,其实意义也不大,毕竟 Go 语言比较新。 有人说过不能写吗,确实有人说了没法写,这也是我的疑问点。 对于 C 语言,Go 的定位其实并不适合和 C 语言比较,且如果 Go 语言编写体验跟 C 语言差不多,那为什么要用 Go 语言呢,因为 C 语言性能更好。 |
Hanggi 17 小时 58 分钟前 @fkdog
问题背景很简单, 很多人说 Go 语言写不了业务逻辑(或者写不好,或者写起来痛苦), 但是又有很多人在问,有个项目到底用 Go 还是 PHP (或者 Java...) 也就说明,有一些人,他看到 Go 语言很火,并且在后端领域有很多应用,想加入 Go 语言生态, 但是又看到很多人说 Go 语言写不了,不适合写业务逻辑,而感到迷茫。 所以,我发了个贴,希望那些说 Go 语言不适合写业务逻辑的人, 把你们的场景分享出来,看看问题到底出在哪里。 |
dbskcnc 17 小时 57 分钟前 1 我来挺一下 lz, 不管有多少人不屑于 go ,事实就是越来越多的业务用 go 来写了。
|
LeegoYih 17 小时 50 分钟前 |
Slurp 17 小时 47 分钟前 2 1. Go 语言性能高吹的成分居多,你列的 Gin 在 TechemPower 的排名里面排第 63 位,是第一名性能的 23%。Fiber 框架性能在 Go 里最高,然而 Star 不如 Gin 。整个 Go 的平均性能可能和 Java 差不了多少... 说 Star 数多少多少真心没啥意义…… Go 这么火,你还是要搞清楚一点不是他语言多厉害,纯纯的就是微服务撑起来的。
2. Go 还可维护。动不动就是 codegen ,类型系统不是简约,是简陋。天天就是 if err != nil ,快赶上 C 了。隔壁 Rust 比你 Go 更 native ,怎么人的 Result 类型这么正常。都是现代语言,不要求你多高雅,正常一点总行吧。if err != nil ,这种模板代码,真的和 Java 里判空一样啰嗦…… 没有 native 命,却患 native 病,是对 Go 语言最好的描述。 --- 你用 Go 写写中间件挺好的,没人反对你。硬要扯业务代码全都用 Go 写,这不自虐。 |
lifeintools 17 小时 37 分钟前 你喜欢就用呗。这还值得开个贴讨论吗?
|
singerll 17 小时 37 分钟前 via Android 复杂的业务根本不是一两句话加几行代码都能说清的,你让大家举例根本就不现实
|
Hanggi 17 小时 32 分钟前 @XCFOX
确实 ORM 这块有这个问题, Typeorm 的查询方式感觉依然是弱类型,要么包一层 interface 不然也是有写错的可能性。 GORM 确实有不少槽点,但是不管代码量还是心智上并没有太大负担(个人感觉),因为变量是未初始化的。 不知道你怎么想。 ent 的话通过 code generation 解决了类型安全问题,但是灵活性上也确实有损失。 但是比起用 xml 定义这些,感觉这种方式还是可以接受的,至少编写起来没有太大压力。 |
q474818917 17 小时 30 分钟前 程序员都是一根筋,你咋不思考思考你为何不是北京人,在这方面较劲有啥用
|
ChrisFreeMan 17 小时 30 分钟前 尝试说服别人是一件容易让自己发疯的事情,放弃说服他人,专注做好自己。
|
wdwwtzy 17 小时 26 分钟前 严重同意 1 楼 2 楼和 17 楼
|
Hanggi 17 小时 21 分钟前 |
dog82 17 小时 18 分钟前 2 docker 、redis 、etcd 、tidb 都是用 go 写的,区块链也是 go 的天下
但是 go 依然是很拗口的语言,特别是从 java 转过来的 |
Bazingal 17 小时 15 分钟前 1 不明白云原生跟 go 写业务有什么关系,没错 k8s 和 docker 都是用 go 写的,但是这跟你用 go 写业务有什么关系,难道用 go 写有加成?别的语言照样跑在 docker 、k8s 上,生态比你好,开发速度比你快,性能比你强,扯什么云原生有什么意义。go 之所以招黑就是因为很多 go 粉太双标,自己没有的就是又不是不能用,我们不需要,自己有的就吹得好像只有自己有一样
|
yogogo 17 小时 4 分钟前 工具而已,别那么较真
|
allen9009 17 小时 2 分钟前 语言不是界限,用啥语言看场景
|
herozzm 17 小时 2 分钟前 能写,痛苦而已
|
keepeye 17 小时 0 分钟前 脚本仔永远无法理解,他们只顾自己写的爽
|
alteremliu 17 小时 0 分钟前 怎么可能不能写呢,java 已经写完了 CRUD ,你还在写 entity
|
AprilNovember 16 小时 58 分钟前 3 go 的魔怔人最多 真不是乱说的😅
|
Hanggi 16 小时 57 分钟前 @Bazingal
你这段话攻击性还是挺强的,本来这种话不太回的,就回一次。 k8s 那么复杂一个系统,调控那么多容器,去除底层的一些 low level 逻辑,给用户提供的接口是没有业务逻辑的吗。 难道只有 CRUD 才是业务逻辑。 还有,好多人说什么 Go 吹,Go 粉,这种论调其实挺无趣的。 写过 Go 语言的人哪个不是从其他语言过来的,现在已经很少有人会站某一门语言去怼其他语言,因为你站的语言和你怼的语言你都会,跟左右互搏有什么区别呢。 只有那些只会一门语言,生怕自己的饭碗被抢走的人才会如此敏感吧。 没什么其他意思,只想就事论事,讨论讨论问题,如果伤害到某些人,先说声抱歉。 希望不要把问题带到奇怪的方向。 |
Mexion 16 小时 48 分钟前 3 @Hanggi 事实上这不是 ORM 的问题,本质上是 Go 这门语言的问题,Go 由于追求极致简陋抽象能力太差,支持的特性太少,在使用中可能遇到:要么多写大量重复代码,要么各种转型,要么丢失安全特性变成动态语言,要么各种 for 循环等等等......太多了,我都不想一一点出来,实在丑陋繁琐至极,毫无优雅可言,然后就是特性弱就算了,还非要强吹设计哲学,实际上挫的不行。当然,我也不否认 go 有它的优点,go 生来就不是做 web 的料,在它擅长的领域发光发热就好了,你要说做 web 可不可以,当然也可以,最重要的一点就是:又不是不能用!
|
ericguo 16 小时 14 分钟前 @XCFOX > const article = await articleRepository.findOne({ title:"Tales of Ten Worlds",published:true });
论优雅 Rails 还真没怕过谁。article = Article.find_by title: 'Tales of Ten Worlds', published: true |
yx1989 16 小时 13 分钟前 Java 库的 github star 数量确实偏少。当年各种 Python 都好几万 star 的时候,Spring 的 star 才几千。
不过 star 多并不能说明适合写业务逻辑,仅能说明这个库比较 成熟 or 热门。 |
lancelock 16 小时 4 分钟前 1 一股子饭圈味
|
nyakoy 15 小时 58 分钟前 每月一战,这个月来的有点早。
|
Kiriri 15 小时 27 分钟前 没有人说 go 写不了业务逻辑, 能写和写的舒服是两码事
|
dqzcwxb 15 小时 25 分钟前 |
zapper 15 小时 19 分钟前 1 你们在吵的时候我一个叫小申的同事又手搓 01 并部署一套业务了,谁的问题?
|
Al0rid4l 14 小时 41 分钟前 2 冷知识: Python 是强类型语言
强类型弱类型静态类型动态类型都分不清楚...看到「强类型语言是比脚本语言好很多」就不想看下去了 |
XCFOX 13 小时 50 分钟前 @Hanggi #58
TypeScript 的类型系统是十分强大的。得益于 TypeScript 的装饰器与泛型系统,TypeORM 的查询参数是强类型的,无需包一层 interface ,在编译时就会有类型检查。 相比之下,go 要实现比肩 TypeScript 的类型安全 就只能参考 ent 这种 code generation 的模式。 |
raykle 11 小时 58 分钟前 袁隆平袁老的问题
|
GeruzoniAnsasu 11 小时 45 分钟前 OP 如果搞得明白会在语言帖子里吵起来的都是些
1. 没有权限或能力控制选型 2. 搞不明白自己的系统需要什么特性 3. 只接触过两三种语言写过一两种范式 的人,就不会发这个帖子了 「为什么用 go 写 web 」跟「为什么用 js 写 arduino 」 是完全一致的问题,想想为什么后者没人吵 |
Sendya 11 小时 2 分钟前 via Android 说句实话,写了几年,写 crud 多少有点痛苦。
|
inframe 10 小时 23 分钟前 哪个能让我今天最早下班,我就用哪个;
所以我选择 Python😎 |
dhssingle 10 小时 22 分钟前 C# EF Core
var article = await context.Articles.FirstOrDefaultAsync(x => x.Title == "Tales of Ten Worlds") |
Aloento 9 小时 27 分钟前 写 curd 很痛苦
then ,ASM 也能写,你用吗? |
limon 9 小时 20 分钟前 去掉 Goroutines 这门语言我不会多看一眼,就这么简单
|
Actrace 9 小时 16 分钟前 我觉得业务问题倒是其次,之后可以通过迭代来增加功能以解决这些问题。
go 现在最大的问题是过分依赖 github ,这是从语言层面的依赖,更具体一些,就是产品定位。 作为一个工具,肯定不能去依赖一家商业公司来实现某些功能。没有哪家公司或者开发者会希望明天 github 没了,go 就不行了。这跟 serverless 的包袱几乎一致了。 |
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK