
1 pfffs 2024-08-14 17:26:28 +08:00 Golang 伟大,无需多言 |
2 dyllen 2024-08-14 17:27:28 +08:00 能赚钱就行,管那么多搞屁。 |
3 xiaozhisoc 2024-08-14 17:27:58 +08:00 只能说设计就是这样设计的吧,说实话 golang 的极简风格导致我每次取变量名都要犹豫好久...... |
4 KaynW 2024-08-14 17:32:26 +08:00 自己觉得好用就行,不用管别人评价。别人评价特别好也不会直接给你写代码 |
5 sagaxu nbsp; 2024-08-14 17:32:35 +08:00 Go 的理念很好,标准库也很好,但语法层面,跟时期出来的语言相比,是差点儿意思,但胜在简单,很少遇到让人惊讶的写法 |
6 dilu 2024-08-14 17:33:38 +08:00 这么说吧,一个语言或者框架越是被骂/被喷,说明它越火 那些凉透的语言,根本没人在乎 就像都说红颜薄命,实际上是因为没人在意丑 b 活多久 |
7 emSaVya 2024-08-14 17:35:03 +08:00 嫌 err nil 繁琐的我确实不理解。你写哪个语言函数调用不判断 err 啊? |
8 joyoyao 2024-08-14 17:35:19 +08:00 每个语言都有人骂,java 也破烂不堪,连个协程都不支持,大家都开始用 kotlin 。python 也破烂不懒,python2 和 python3 差异太大,运行速度还慢。Javascript 更恶心,各种兼容包,还要搞 typescript 。 |
9 LieEar 2024-08-14 17:35:56 +08:00 我觉得最爽的是二进制部署,docker 包 10MB |
10 yazinnnn0 2024-08-14 17:36:24 +08:00 scheme/racket 巨牛逼, 有人用吗? go 再破烂不堪, 能让你挣钱不就得了 |
11 git00ll 2024-08-14 17:36:43 +08:00 用来开发小工具超棒,体积小、占用内存小、支持平台多 |
12 wweerrgtc 2024-8-14 17:39:28 +08:00 十几年前就认识 Go, 这么早 |
13 wktline 2024-08-14 17:44:07 +08:00 那就用 nodejs 吧,小服务完全覆盖 |
14 lasuar 2024-08-14 17:47:44 +08:00 |
15 cmdOptionKana 2024-08-14 17:47:55 +08:00 很正常,这与懂车帝就很像,每个车圈里面都骂声一片。其实人性就是如此,喜欢骂一骂,热度热高越招骂。 |
16 henix 2024-08-14 17:52:46 +08:00 喷的人越多说明用的人越多,真正没人用的语言没人关注 任何编程语言都有优点和缺点,都是取舍,看应用场景选择就好 知乎的推荐机制挺奇怪的,容易产生信息茧房,一部分人慢慢就不发言了。不如多关注几个平台,例如微信公众号、掘金 |
17 NathanCyberC 2024-08-14 17:53:19 +08:00 用过了就知道 Go 有多爽了,关注业务代码,几乎没有任何糟心事,能够跟它比的就是 Rust 了,但是 Rust 写起来还是比 go 费劲。 |
18 CodeCodeStudy 2024-08-14 17:54:24 +08:00 java 也要判断 != null 的,别的语言也类似,反正就是调用函数的时候都需要对返回值检查一遍 |
19 Ipsum 2024-08-14 17:55:34 +08:00 go 一眼看过去就知道干嘛。java 没注释,我都不知道他想干嘛。 |
20 jlak OP 我目前用下来这真的很喜欢 Go ,满足我了大部分需求 *编译型 *跨平台 *快速开发 *速度快 *并发 我想要用来代替 Python 虽然开发速度赶不上 但难度目前来看真高了多少 |
21 jlak OP *难度高不了多少 少了一个关键字,没编辑按钮… |
22 DefoliationM 2024-08-14 18:16:20 +08:00 via Android 学 rust 吧,现在学 go 是 49 年入国军。 |
23 hatch 2024-08-14 18:19:06 +08:00 难用都别用,让我独享“经验” |
25 xuld 2024-08-14 20:45:36 +08:00 大家都喜欢烂东西。毕竟真正优秀的东西是没人喷的,毕竟没人用,怎么喷。 |
26 byboy 2024-08-14 21:04:53 +08:00 “Go 语言真的有这么破烂不堪吗”这个标题很有知乎味,我认为这种问题不应该出现在这里。希望这里不要像知乎一样。 |
27 neoblackcap 2024-08-14 21:14:56 +08:00 遇到需要 CGO 编译的东西你就笑不出来了 |
28 trzzzz 2024-08-14 21:19:04 +08:00 Go 太好了,真开箱即用 |
29 kenvix 2024-08-14 21:21:31 +08:00 @emSaVya #7 有异常的语言还真不判断。判断只在外层合理的时机才执行,甚至还可以外包给框架去判断 当然你说你是 C 语言爱好者当我没说 |
30 james122333 2024-08-14 21:52:06 +08:00 via Android go 基本上还不错 当然有痛点 那就是动态性不太佳 反射也不太好用 毕竟 go 有指标 指标配上反射巨难写 外加范型整个有种很烦的感觉 但为了方便以后弄只好硬写 说到范型只能说 go 目前的是仅堪用 写法有点局限 除了原始函数其它函数加范型牵一动全身 |
31 Ricebucket 2024-08-14 21:52:56 +08:00 via Android 这个“破烂不堪”的结论是咋得出来的,你别告诉我就是因为 err |
32 james122333 2024-08-14 22:01:16 +08:00 via Android 当然以麻烦程度 rust 最高 java 则是写一般的超麻烦 写反射倒是还可以 |
33 hefish 2024-08-14 22:05:43 +08:00 拿着千元的工资,操的万元的心。 |
34 jlak OP @Ricebucket 不是,上面说了 Go 在知乎上几乎方方面面被骂 我没有一一列出来,因为讨论范围会太广 举个小例子(仅列出 无个人观点)给我推送的一些回答是关于 []作为泛型符号 速度不如 C# 协程还不如 java 虚拟线程 缺少很多内置功能 没有好的 ORM GIN 性能差 关于 map 什么的我忘了 作者系统语言是大牛 但写 Go 就是草台班子 等等根本列不完 |
36 jlak OP 我对 Go 如前言里说的印象一直很好 直到上手后更是喜欢 所以不太理解为什么会被喷的这么惨 |
37 guanzhangzhang 2024-08-14 22:30:37 +08:00 |
38 lhasa 2024-08-14 22:38:17 +08:00 go 天下第一好用 |
39 yanyao233 2024-08-14 22:40:31 +08:00 via Android 没人用的语言没人骂 只要有人用就一定会被骂 如果一个语言能满足所有人需求,就不会有现在的百花齐放了 |
40 BBCCBB 2024-08-14 22:41:38 +08:00 rust 大法好 |
41 dobelee 2024-08-14 22:41:41 +08:00 这么多年,喷来喷去就是 err 和泛型,我都看腻了。请换点新花样。 |
42 james122333 2024-08-14 22:45:58 +08:00 via Android @jlak []泛型还可以 协程 go 的最方便 运行效率部份很多时候只是标准库实现的并不高效而已 而 gin 刚好就用标准库的 orm 可以自写 map 只有一个痛点那就是 for each 的时后键值要自己排序否则乱序 其实也还好 |
43 james122333 2024-08-14 22:55:36 +08:00 via Android 运行效率再举例 很多人范例和人很爱用 fmt 包 其实这包做了很多其它事 也透过实时反射比较低效方式 明明有时候只是要列印出字串 这时候直接用 println()会是更好的选择 |
44 duluosheng 2024-08-14 22:59:52 +08:00 Go 语言本身很简练,生态在慢慢丰富。 |
45 james122333 2024-08-14 23:05:44 +08:00 via Android 我还是觉得 go 应该要有第三方标准库 |
46 yu1miao 2024-08-14 23:17:28 +08:00 Go 泛型从 2010 年 6 月到最终落地足足有四五个不同的实现版本。 早期版本引入新关键字 contract ,直到 2020 年官方宣布放弃 contract 而采用 interface 关键字来实现(也就是 FGG/FG 方案)。 顺带一提,FGG 方案的作者,也是 Java 泛型的作者 interface 方案相比 contract 进行了大幅简化。除了 interface 定义,几乎没有引入什么新语法,对 caller (client) 来说完全无感、也不需要修改任何代码(编译器自动完成类型推断); 而且所有泛型都会在 编译期 被消除,实现了极致的向下兼容。 单说泛型这块,实在没什么可嫌弃的 |
47 james122333 2024-08-14 23:26:14 +08:00 via Android |
48 mengzhuo 2024-08-14 23:28:24 +08:00 Rust 就一点……编译太 TM 慢了,经常要 5 分钟以上……我这还是 16 核服务器 128G 内存啊,开发板上更慢了,1 小时打底…… Go 能基本能写完就编译好,然后开始跑测试,实验 泛型,老子写业务代码基本不用,麻烦,不如 interface 方便。 库作者自己头疼并折腾去。 |
49 Mandelo 一个工具,天天被喷烂,还没被淘汰 说明它其他方面很优秀 不懂 go 的路过~ |
50 chaleaochexist 2024-08-14 23:34:36 +08:00 我学啥 啥被喷 学 python 说 动态语言一时爽, 代码重构火葬场 现在不做 python 了做 go 还不行吗? 依然被喷. |
51 jianchang512 2024-08-14 23:37:25 +08:00 Go 的最大缺点是学习曲线不够陡峭,导致太容易入门,逼感不够(doge |
52 greenhandlwh 2024-08-14 23:40:43 +08:00 @jianchang512 竟然有点道理 |
53 weiwenhao 2024-08-14 23:45:33 +08:00 有一些语法诟病但瑕不掩瑜,golang 拥有顶级的跨平台编译,垃圾回收,协程, 兼容性。 |
54 jackmod 2024-08-14 23:45:40 +08:00 书写简洁,自动管理内存,静态链接机器码,vendor 锁死版本依赖。 真没有几个比 golang 还要紧致的了。 |
55 leonlx 2024-08-15 01:15:04 +08:00 via Android 好像是 C ++之父说的吧,世界上只有两种语言:没人用的和广受诟病的 |
56 Leviathann 2024-08-15 02:44:25 +08:00 @yu1miao philip wadler 伟大 无需多言 |
57 Trim21 2024-08-15 06:22:44 +08:00 via Android |
58 emSaVya 2024-08-15 06:31:30 +08:00 @kenvix 异常不就是处理错误的机制吗?外层不就是在调用处判断吗?这跟 if err 有啥本质区别?难道说就要积累几层调用链 不管是 CE 还是 Runtime Error 都堆到一个地方处理?我不确定这样写的能过 cr 。 |
59 laohucai 2024-08-15 07:15:02 +08:00 写命令行程序不二的选择 |
60 jaynsw 2024-08-15 07:58:29 +08:00 via iPhone 系统开发的不喜欢它有虚拟机 再就是异步调用被 gorouting 抽象掉了 没法利用系统调用优化 在应用开发领域 个人觉得 node js 更优 语法也更强大 |
61 CynicalRose 2024-08-15 08:33:09 +08:00 via iPhone soyo (即答 |
62 wssy001 2024-08-15 08:36:19 +08:00 google 的技能树全点在如何提升 AOT 编译速度上了,当初创造 golang 不就是为了加快项目编译 golang 只是 C 的网络语法糖,C 不擅长的,golang 也不擅长 |
63 yangzzz 2024-08-15 08:47:21 +08:00 @Ipsum 哈哈哈,我最近在接触 python 的 django 框架。去 github 上拉了一个别人写的项目,里面很多东西真的不写注释我也看不懂 |
64 voidmnwzp 2024-08-15 09:03:02 +08:00 因为它简单 |
65 layxy 2024-08-15 09:06:18 +08:00 Go 语言胜在语法简单,没太多的语法糖,你可以去看一些开源代码,基本没啥难度,其实 error 没问题,只是习惯了别的语言,需要适应下 |
66 me1onsoda 2024-08-15 09:07:34 +08:00 用 go 来刷题,有个明显的不爽,二维矩阵没法一步到位声明初始化 |
67 label 2024-08-15 09:13:24 +08:00 为什么 java 在鄙视链最底端, 被所有其它语言开发者鄙视 |
68 nxcdJaNnmyF9O90X 2024-08-15 09:25:14 +08:00 语言的趋势 肯定是大道至简 go 这种绝对是未来趋势 反而 java 这种又臭又长的裹脚布 终会被历史抛弃 |
69 securityCoding 2024-08-15 09:30:32 +08:00 via Android 人云亦云,先多写几个项目再说吧,等组织架构变动时隔壁组交接扔过来 100 多 c++微服务你就知道老实人的好了 |
70 panxi 2024-08-15 09:50:25 +08:00 因为 go 的设计哲学就是显示性和简单性, 比如在 go 中没有类似 python 的 in 操作的语法糖, 你得遍历 orz |
71 artiga033 2024-08-15 09:52:37 +08:00 via Android go 的错误处理 我记得官方当年自己推 go2 草案的时候都想过要解决这个问题,一堆人还搁那洗 不过也只是草案罢了 后来也没实现,他哪怕学一下 Swift 的`try?`或者 Rust 的`?`来替换下那几乎每个函数调用后面都有再占三行甚至四行的 if err return 呢 泛型完全不好用,很多时候同样的情况放 C# Rust 都是能自动推导的,比如我初始化结构体调用另一个 New 函数作为初始化字段,这个字段都是显式泛型类型了,那个泛型函数的类型居然还要我再写一遍? 元编程能力全靠代码生成,难用的一 b ,当然这点其他语言也没好到哪里去 多返回值并非好设计,一旦哪个函数返回多个值那你的链式调用或者嵌套调用就不得不断,当然要是认为这变相保证了代码可维护性也不是不行... 不知道有没有人用过 golang 的 MongoDB ,只要对比一下就能发现 golang 的 map 和 slice 语法到底有多嗦 不过要说和 java php 比,那我肯定选 golang ,但是要是吹 golang 语法简单就怎么怎么着的,那我的评价是 go 就是个多了强大的标准库和语言级协程支持的 C 语言罢了 不过云原生时代需要容器体积相对小,又完全自包含的应用,go 确实是不二之选,其他语言要么像 python nodejs 镜像体积太大太乱,要么像 java C#都还在摸索 aot 编译的路上,Rust 入门难度又是地狱级的,golang 占主流也没什么奇怪的 |
72 p1gd0g 2024-08-15 09:53:45 +08:00 就全栈 crud boy 来说,没重载,没 linq ,没 partial ,有循环引用问题。同样的业务一定是 c# 更快,重构更方便。 当然和 c# 去比本身也不公平 |
73 noyidoit 2024-08-15 09:56:19 +08:00 @neoblackcap 所以我现在会绕开所有使用 CGO 的东西,比如 mattn/go-sqlite3 |
74 zacard 2024-08-15 10:00:21 +08:00 挺喜欢 go 的,很多 agent 类的项目都用 go 写的 |
75 InkStone 2024-08-15 10:03:21 +08:00 错误处理这块,带完备 checked exception (意思是 Java 这种就别来碰瓷了)的异常机制,或者 Rust 这种 sum type 支持的 Result ,都比 Go 的错误处理要舒服很多。 Go 的错误处理机制其实就是 C 的特化版,稍微调和了一下 C 的错误处理与返回值的矛盾,但也仅此而已了。 |
76 gowk 2024-08-15 10:10:18 +08:00 Go 好是好,但是写业务的时候总感觉哪里不对,想问大家,用 Go 写业务的体验如何 有没有什么最佳实践之类的 |
77 Rache1 2024-08-15 10:27:41 +08:00 @emSaVya #58 当调用层级越深,这东西越恶心,在我个人看来,方法内部调用链是不是有错误,交给最上层来决定就好了,除非你关心它,没必要一层层传出去。错误这种东西,大部分时候抛出了就说明进行不下去,无可恢复了,如果其中的某一层认为它可以恢复到预期,它就可以捕获了,然后返回正确的结果出去就好了。比如 A->B->C->D->E 这种调用链,E 出了错误,其实完全可以由他的最上层( A )来处理就好了,甚至都可以留给全局异常兜底,没必要在每一次都写一下 if...err 。 ![]() |
78 yu1miao 2024-08-15 10:45:21 +08:00 @Trim21 不应该啊,Go 不允许运行时泛型,编译器会把泛型翻译成普通的类型。 以「泛型函数」为例,处理分为 2 步: 1. 具化( instantiation ):根据泛型函数的具体实参,以泛型函数 func foo[P T](param P) 为基础,生成一个不带泛型的普通函数 func foo(param int64) 这里假设传入实参类型为 int64 。然后将该调用绑定到生成的函数 2. 调用( invocation ):调用生成的普通函数 按理说,几乎不会有性能差别。 |
79 duty 2024-08-15 10:47:10 +08:00 @neoblackcap #27 我忘了哪个大佬说的了,“CGO 不是 GO” |
80 vczyh 2024-08-15 10:47:12 +08:00 Go 写业务不是很爽,但是有 IDE 的话也能凑合,Go 最适合中间件和 CLI 这种东西,推荐下自己写的: https://github.com/vczyh/redis-lib |
81 gongquanlin 2024-08-15 11:07:40 +08:00 除了写 interface 继承做策略工厂的时候比较麻烦,其他的写业务时候还能容忍 但是编译速度快 + 运行成本小 + 部署无需纠结环境 让我容忍了 go 所有的缺点,哈哈~ |
82 losephsky 2024-08-15 11:11:00 +08:00 唔,再早之前不是一堆人各种夸 golang 吗? |
83 LanLiang 2024-08-15 11:12:51 +08:00 挺好的,说明用的人更多了 |
84 HappyAndSmile 2024-08-15 11:33:56 +08:00 10 多年前就认识?不太相信 |
85 jadeborner 2024-08-15 11:34:28 +08:00 go 已经不错了,还搁这挑三拣四的 |
86 uiosun 2024-08-15 11:39:31 +08:00 @emSaVya #7 - try ... catch 直接包裹住问题,不判断 - 对值的合法性进行判断 当初一直这样写,很简洁。 初转 go 的时候,最难接受的就是 120 行代码,15 个 err != nil 判断……属实有点多了,那会儿最希望的是:你直接 panic 吧,别抛给我了 orz |
87 wysnxzm 2024-08-15 11:43:46 +08:00 |
88 assassing 2024-08-15 15:20:36 +08:00 @Rache1 在 Python 中统一错误处理写习惯了,这是我学习 Go 中最不习惯的地方。本意是让开发根据不同错误,就地给出不同解决恢复方案,但这与保持简单相悖。能写出恢复方法就能写出预防方法,防止异常发生。其他情况,同样只能打个日志干瞪眼。 |
89 hez2010 2024-08-15 17:33:06 +08:00 via Android Go 的错误处理繁琐是一回事,更重要的是设计从根本上就是错误的。 result, err := foo() 一个函数是否发生错误只可能有两种情况,要么发生错误没有结果,要么不发生错误有结果。而 go 的设计直接给你来了个有无结果和有无错误的迪卡尔积,搞出来 4 种情况。 再有,如果你不去手动判断 err 是否为 nil ,则这个可能发生的错误就会直接被无时掉,意味着 go 的错误模型是默认无视掉所有错误。 这种用于错误处理设计不管出现在哪个语言里都是逆天的存在,与其说是错误处理,不如说它就是返回了个 tuple ,而实际上并不存在任何的错误处理机制。 |
90 Jinnrry 2024-08-15 17:48:28 +08:00 go 哪里破败不堪了? 1 、交叉编译,在座各位有能打的吗 2 、部署体验 3 、没有乱七八糟的包,没有各种语法糖,这是非常大的优点。给你一个上万行的 java 、python 、c++代码的项目,经过几十人接手,每人用着奇奇怪怪的语法糖简写,你看看你能看懂几行 4 、真要破败不堪,battmd 全都大面积在拿 go 写业务,这么多大公司都有病吗 |
92 jlkm2010 2024-08-15 17:52:04 +08:00 go 的语法太怪异 |
93 Tsunayoshi 2024-08-15 18:33:17 +08:00 金斧头还是铁斧头。。能赚钱就得了 |
94 james122333 2024-08-15 19:12:53 +08:00 @hez2010 这叫多返回值 能返回的不只两个 其优点是避免了过多的结构嵌套 因为不是所有东西都值得写一个新的结构去包裹 重要的东西写结构更好 只是通常第二返回值为错误 错误处理方式当然直接中断是方便的 但中断本身消耗的资源就多一些 而且你不会知道什么时候会抛错 有些错误是不需要中断的这时候抛错的缺点就跑出来了 需要外部包裹捕获错误的代码 而且 go 并没有缺少中断抛错的方式 所以反而更好 近期我发现一种写法可能更好 那就是写个函数里头判断是否为 nil 不为则 panic 配上 go 里头强大的 import 很好用 go 的 import 具有普通 import 、import as 、import 仅作为依赖、import 至当前命名空间 比 java 的不知道好多少倍 不用写包全名 不用因命名空间让代码不够整洁 如下 package Panic func PanicIfErr(err error) { if err != nil { panic(err) } } ================================= package main import ( "strconv" . "example.org/panic" ) func main() { a := "123" i, err := strconv.Atoi(a) PanicIfErr(err) println(i) } |
95 Trim21 2024-08-15 19:27:37 +08:00 @yu1miao #78 go 的泛型在面对接口的时候不是这么处理的,可以跑一下这个 bench 试试。这里的 BenchmarkExtra 多了一次接口虚表查询。 https://go.dev/play/p/jMm3oAbaLX0 |
96 gongym 2024-08-15 20:26:59 +08:00 只有两种语言,一种很多人骂,一种没人骂。 有人骂代表有人用,骂的人越多证明用的人越多。 再说了,从自己的需求出发,适合用什么语言就用什么语言。这年头还有不是全栈工程师的程序员嘛 |
97 geminikingfall 2024-08-15 20:37:57 +08:00 能用就好,其实除了范型太难看,其他倒没啥太大问题。 |
98 lix7 2024-08-15 20:58:15 +08:00 |
99 dreamrover 2024-08-15 21:00:57 +08:00 我是曾经的 go 吹,现在的 go 黑,go 的各种限制太死了,玩了一圈感觉还是 C++香,自己写小东西用 nodejs 更爽,Javascript 语法基本照抄 C ,特别灵活,库也特别多。 |