先说感受到的先进性:
劣势:
不确定性:
综上所述,感觉 Go 确实是一个目前比较理想的开发工具,大家一起讨论讨论,人生苦短,为何不用 go ?
103
xinxu 2016-04-03 22:19:20 +08:00
说了半天没说 goroutine 是什么情况
|
104
bramblex 2016-04-03 22:29:31 +08:00 1
|
105
xhowhy OP @bramblex 呵呵 用不着你科普 我用 node.js 写过日 pv 八千万的网站。。绝逼不是吹牛
虽然如此我仍觉得 node.js 的 callback 和 go 的 goroutine + channel 一比就是一坨翔。。而且 go 也支持 callback , callback 这货用来做界面编程还行,用来做并发真不如 goroutine + channel 直观 |
106
xhowhy OP @xinxu 可以自己去看啊。。改天我撸个典型的场景 看看 async.js 、 co 、 promise 和 go 的各自实现
|
107
edward1992 2016-04-03 22:41:59 +08:00
又来整个大新闻,把 node.js 给批判一番?
|
108
xhowhy OP 不明白为什么有人抱着 callback 当宝不放,不看看外面的世界,这么抵触新的知识和观点。。。 async.js 、 co2.0 、 co 4.0 、 Promise 的存在,不都是为了解决 node callback 在并发业务逻辑处理上的表现力问题吗
|
109
barbery 2016-04-03 22:51:25 +08:00
Go 真心是不错的,学习成本很低,性能只能说碉堡。。。唯一不爽的就是 if err != nil
|
110
Wangxf 2016-04-03 22:58:47 +08:00
Node.js 从来都不是拼语言,我们是拼的生态环境, js 使用者数量大而已
|
111
XIVN1987 2016-04-03 23:08:12 +08:00
go 还不支持泛型
C++、 C#、 JAVA 都支持泛型,新出的其他编程语言也都支持泛型,,就 Go 不支持 |
112
chiu 2016-04-03 23:08:55 +08:00
貌似楼主初衷只是想讨论一下服务端领域的 Go 和 Node.js 的应用,怎么就干上了……
建立楼主 Append 说明下吧 @xhowhy |
115
ovear 2016-04-03 23:25:43 +08:00
等等。。满屏幕的 callback 是 nodejs 的优雅么。。我记得好像之前还有人在喷 nodejs 回调一多, stackprint 就不完整。。
|
116
superhxnju 2016-04-03 23:34:08 +08:00 via iPhone
没人黑 Go 没有很好支持范型这点很烦么……还有不能函数重载也是醉了
|
117
xhowhy OP @bramblex
你是不是觉得就你牛逼就你懂 callback ? koa 为什么要先后用 yield 和 await 来替代 callback 问题?就是因为复杂的业务逻辑是不适合用 callback 来表达,也不利于调试,所以用 yield 和 await 显著改善了异步代码的开发和调试难度。 goroutine 和 channel 是啥懂不懂?也建议你看看,开喷前请提高姿势水平,不要为了喷而喷。 |
118
demomaster 2016-04-03 23:39:11 +08:00
C 语言简洁,装的飞起.(*(void)(*)( ) )0)( )求告知
|
120
kookxiang 2016-04-03 23:41:21 +08:00
辣鸡 npm
go 无中心的包管理不会导致 npm 的 left-pad 事件(滑稽 |
121
xhowhy OP @demomaster 就语法而言, C 语言之父 Dennis 编写的《 C 程序设计语言》就讲完了,就很薄的一本书。语法简洁不代表代码就没有复杂度,同理 lisp 。
|
122
demomaster 2016-04-03 23:51:13 +08:00
@xhowhy Pascal 还 35 页呢,再说了**<<The C Programming Language>>**又不是初学者看的.书薄不代表语言简洁.
|
123
xhowhy OP @superhxnju 某些 node 社区的人哪里知道什么泛型,就信仰 callback 是宇宙无敌黑科技,听不得别人黑 node ,见不得别人有不同观点。。我日常工作就是搞 node 的,拿 go 出来与 node 比较一下,就被喷成不懂 callback 和装了,呵呵
|
124
nareix 2016-04-03 23:57:02 +08:00
恭喜 lz 脱离苦海。动态一时爽,重构火葬场。
|
125
xhowhy OP @demomaster C 语言语法简洁全世界公认,就你不这么想,你是故意抬杠还是智商捉急呢?
|
127
demomaster 2016-04-04 00:04:42 +08:00
@xhowhy 世界公认,给个链接看看? 说两句就人身攻击了,真是智商捉急
|
129
xhowhy OP |
130
xhowhy OP @demomaster 我先人参攻击?谁一上来不分青红皂白地说别人装呢?哥装用得着你说?你是 @bramblex 猴子派来的逗逼吧,两人一副德行
|
131
demomaster 2016-04-04 00:12:00 +08:00
@xhowhy 给个维基的链接什么意思哦?ctrl+F "简洁"到一个结果,还是说 goto 的
|
132
xhowhy OP |
133
murmur 2016-04-04 00:19:51 +08:00
go lang =够烂
在宇宙第一语言 php 之前什么都是渣 (java 属于信仰问题 不在讨论范畴内) |
134
xhowhy OP |
135
RqPS6rhmP3Nyn3Tm 2016-04-04 00:49:22 +08:00 1
@xhowhy 抱歉,为啥要 at 我……
我只是不明真相的吃瓜群众…… |
137
RqPS6rhmP3Nyn3Tm 2016-04-04 00:58:46 +08:00 1
@xhowhy 哇靠吓死了, V 站撕逼请务必不要叫上我……
|
138
hxtheone 2016-04-04 02:02:30 +08:00
LZ 你这是要搞出个大新闻啊
|
139
Akasha 2016-04-04 03:51:16 +08:00
楼主支持你,新东西需要敞开胸怀去接受
|
140
iannil 2016-04-04 04:38:44 +08:00
热闹,占座。
|
141
cuebyte 2016-04-04 07:11:11 +08:00
夭寿啦,学了两天的 Go 粉来 V 站炸鱼啦!
请完整写过 1000 行以上的项目再来夸吧, Go 也就算个新时代的 C ,以及 goroutine 不错,其他方面也许还不如 Java 、 C# |
142
nicevar 2016-04-04 08:39:28 +08:00 via Android
观战
王大神把 go 批判的一无是处 |
143
shyling 2016-04-04 08:57:33 +08:00 via iPad
😏给你说几点:
defer,panic 什么鬼。 莫名其妙实现了接口什么鬼,明明静态类型弄的像 duck type 。 n:=struct{}是什么东西。。为什么有的要&struct{}。 map[string]string 是什么?为什么我自己用不了这个语法。 我靠经验尝试用"string".Replace ,呃,好吧,还要用 string.Replace 这个库函数。。不 oo 那就算咯。 😏那么,有什么理由让我们使用 super c 呢?对了, channel 的实现不需要锁? |
144
zbing3 2016-04-04 09:07:40 +08:00
go 有反射就够了……
|
145
jzfr 2016-04-04 09:24:22 +08:00
嗯,火药味越来越重,撕逼已到高潮,是不是准备开打了?!
|
146
GentleSadness 2016-04-04 09:34:34 +08:00
@demomaster (*(void)(*)( ) )0)( ),(void)(*)()无返回类型的指向函数的指针 1 ?(*(void)(*)( ) ) *是指向前面那块东西的指针 2 ? (*(void)(*)( ) )0) 默认值是 0 ? 最后那个 () 函数调用?
|
147
demomaster 2016-04-04 09:40:12 +08:00
@GentleSadness 计算机启动时,硬件调用首地址为 0 位置的子例程.
|
148
demomaster 2016-04-04 09:41:01 +08:00
|
149
kslr 2016-04-04 09:50:48 +08:00
一些人真是太狭隘了,语言还不是拿来用的
|
150
anonymityl 2016-04-04 10:19:16 +08:00
私以为楼主如果真想讨论,何必取个这样的标题。
|
151
zhuangzhuang1988 2016-04-04 10:19:46 +08:00
你们吵架好厉害,我还是静静的学 F#/C#/Typesciprt
|
152
xiaoyu9527 2016-04-04 10:30:09 +08:00 3
我学 ASP 的时候 你们说 PHP 不知道牛逼到哪里去了
我学 PHP 的时候 你们说 PYTHON 不知道牛逼到哪里去了 我学 PYTHON 的时候 你们说 NODE.JS 不知道牛逼到哪里去了 我学 NODEJS 的时候 你们又说 GO 不知道牛逼到哪里去了 |
153
nareix 2016-04-04 10:36:01 +08:00 3
不出意料 lz 被喷了,战斗很激烈啊,过来支援下 lz
大于 5k 行代码动态语言在生产环境下用都是很坑的。不要拿那些已经用了的项目来说事儿,都是历史问题,一开始能用静态就用静态,用那些傻 x 的不会让人犯错的语言( go/java/c#)。 js 之所以流行也是历史问题,前端只能用它( webassembly 快来拯救世界吧) nodejs 这种看似炫酷但实际坑多的东西就是要吐槽下才好,话说你们真的用它搞过大项目吗,搞过的摸着良心问问自己它坑是不是多, Promise 写起来烦不烦, await 忘记打了返回的结果就完全变了有没有,重构的时候痛苦不痛苦,一不小心就拼错,是不是特别依赖单元测试和回归测试。多人一起搞总有人很容易搞错,那些看着傻 x 的语言的最大优点体现在团队合作上,首先不犯错就是牛逼,其他的事情可以先靠边放。 G 家大量使用 java ,甚至用 java 来生成 js 代码, fb 家的 php 已经是带类型的了。 如果觉得 callback 很牛逼,写多几行你就知道咋回事儿了, callback 只是最原始暴力的机制,再写多几行就会发现 go 的那套的好处以及它考虑的深远程度,是加强版的 promise 和 async/await 。 nodejs 性能倒是还行,主要是由于 libuv 和 v8 ,跟它本身没啥关系。然而单线程模型还是被 goroutine 完爆,就算单线程性能比得上 go 也没用。部署的时候 npm 装一坨就不说了, go 完爆。 没大项目经历的人很容易被坑,一开始搭完一个 prototype 很兴奋,最后干了半天你发现,动态语言压根没有给你节省时间精力,前面节省的时间都被后面坑回来了,再次更换技术选型已经来不及只能继续被坑,换 ts 或者 flowtype 可以缓解,同理 python/lua 基本都是一个情况。 |
154
realsteve 2016-04-04 10:39:33 +08:00 via iPhone
求楼主这个 css
|
155
hooluupog 2016-04-04 10:40:29 +08:00 4
@shyling
defer 有什么不好的吗?具体说说。它类似 RAII 但有所不同。有人用 defer 模拟过延迟计算的特性,实现过一个定时器,这东西有可取之处。 panic 的使用原则就是“不 panic 就尽量不要使用 panic ,但它是个 panic 的时候,要尽早 panic ”。 erlang 里面也有类似的箴言,“尽早的出错”,等拖到后面一个都捕获不到,服务器挂了后抓瞎,不知道原因在哪里。 n:=struct{}就是一个初始化声明,有了&struct{},基本上就用不到“ new ”这个关键字了, n 以后说不定会删掉 new 。 java 里面一堆的 new ,很恶心的,现在新设计的很多语言都是没有 new 的。如果你搞 reactive 风格的编程, new 的恶心程度堪比 call back hell ; map[string]string 就是 map<string,string>,前者是扁平形的,后者是嵌套的,你多嵌套几层,从可读性上你会发现前面的写法还是有可取之处的。另外就是省了个尖括号, Go 是能省就省。比如很多语言的 list 使用"[", "]"来表示,而 Go 里面 struct , map , slice 统统用"{ " , "}"。 "string".Replace ?那你是不是还想要 Int.xxx ,这典型的一切皆 OO 风格。 Go 当初定位是系统编程语言,它不如 c/c++那么底层,但又比 java 底层一些,比 python/ruby/js/php 这些动态语言来说,代码书写的自由度上肯定不能比,但天下没有免费的午餐。 Go 一切是按值传递而非引用(slice 实际上不能说是引用类型, Go 里面没有引用的说法。传递的是指针的值)。那么为何要保留指针?为何不那么 OO ?其实都是一种折衷的选择。因为它当初的定位是系统编程,性能和开销需要有个限度。例子: java 9 或者 10 要实现的 value type 就是这个情况的最好说明。 @ALL 楼主列举的优点是从实战的角度去谈,说的很客观。实际上 Go 的安利文基本上都属于这种。你见过哪篇 Go 的安利文是“ Go xxx 特性多么牛”,“ Go 又实现了个性特性,能 XXX ”....... 没有,一个也没有。 说 Go 好的基本都是从工程化,项目的角度去谈,比如它的标准库很不错,部署很方便,编译快开发效率高有种使用动态语言的感觉,写并发变得简单了些等等。但很多人却不从这个角度去谈,而是专挑语言本身的问题。语法怎么怎么地?没有 xxx 特性,你看看谁谁谁写的文章大骂 Go 是垃圾等等等,这些东西站的角度不同,看到的结果自然会不同。 Go 优缺点并存,你看不到它好的只看到缺点,更是用都没用过,那还能说出什么有意义的东西出来。比如上面有人不断提到“ Go 没有泛型”,这是不是个问题?当然是。但楼主的这个贴,以及所引用的场景,写 10 万行代码都不会有一次要用到泛型的。再就是包管理的问题, Go 做的很差。这个可以展开说,尽情吐槽,有理有据都成。但 Go 的包管理一定不会做成 npm 以及 Rust 的 Cargo 那样的。为何 Go 一开始没有包管理?因为 google 内部自己就从来不用这玩意儿,所以 Go 的开发者也就没有搞这些。实际上 1.5 , 1.6 包管理的进展到实现大部分都是 Go 社区那些人搞的(比如 vendor 那个具体方案就是非 google 的人提出的被采纳了)。 最后,心态都开放一点, Go 不能完全取代 node(至少在 web 开发这一块, Go 没有机会。服务端 Go 很擅长),不用这么怕,充满火药味,它们都是工具,让你的生活变得简单些。这里有个 2 年前的 Go 和 Ruby 的撕 b 贴,很长但没有那么浓的火药味,回帖质量挺高的( https://ruby-china.org/topics/14407)。 转一段 The Little Go Book 上的一段话,看看 Go 与 ruby,python , c/c++/java 间的关系, Go 目前到底适用用来做些什么事情。 Go was built as a system language (e.g., operating systems, device drivers) and thus aimed at C and C++ developers. According to the Go team, and which is certainly true of me, application developers, not system developers, have become the primary Go users. Why? I can ’ t speak authoritatively for system developers, but for those of us building websites, services, desktop applications and the like, it partially comes down to the emerging need for a class of systems that sit somewhere in between low-level system applications and higher-level applications. Maybe it ’ s a messaging, caching, computational-heavy data analysis, command line interface, logging or monitoring. I don ’ t know what label to give it, but over the course of my career, as systems continue to grow in complexity and as concurrency frequently measures in the tens of thousands, there ’ s clearly been a growing need for custom infrastructure-type systems. You can build such systems with Ruby or Python or something else (and many people do), but these types of systems can benefit from a more rigid type system and greater performance. Similarly, you can use Go to build websites (and many people do), but I still prefer, by a wide margin, the expressiveness of Node or Ruby for such systems. There are other areas where Go excels. For example, there are no dependencies when running a compiled Go program.You don ’ t have to worry if your users have Ruby or the JVM installed, and if so, what version. For this reason, Go is becoming increasingly popular as a language for command-line interface programs and other types of utility programs you need to distribute (e.g., a log collector). |
156
chiu 2016-04-04 11:06:10 +08:00
@demomaster 说 C 的 语法 简洁,没问题啊
|
157
jjx 2016-04-04 11:20:41 +08:00
每次看到动态语言项目不能大于 5k 行言论就感到莫名的喜感, 开发者的结构能力, 设计能力到哪里去了, 没有编译型语言的支持, 连大于 5k 行的项目都做不了, 真真是可笑的很.
|
158
jsyangwenjie 2016-04-04 11:32:25 +08:00
不觉得你这个标题是来好好讨论的标题
|
159
levn 2016-04-04 11:33:43 +08:00 via iPad
果然这种帖子最火。。。
|
160
arden 2016-04-04 11:37:35 +08:00
要我再做一次选择,我应该不会选 nodejs 来做项目了,折腾过得出来的经验。
|
163
shyling 2016-04-04 11:45:03 +08:00
@hooluupog
哦。。第一次我刚刚是想说 if err!=nil 的。。怎么写了个 defer 。。 defer 是个挺有意思的设计,虽然很有可能被到处用。不过 defer 和 RAII 没什么联系吧? defer 充当一个 func 的"析构"可以理解。 说 new 的我觉得有点莫名其妙。很多语言省略了书写不代表否认了 new 的过程。另外我问的是 a:=struct_name{}和 b:=&struct_name{}有什么实际意义上的区别,为什么要这么设计 map[string]string 这里就更奇怪了。我问的是为什么标准库的 map 可以用这样的语法,我自己却不能在我的 UserDefined 里提供这样的语法。这是为什么? 最后呢。。又是常见的问题啦,什么是系统编程语言,和 OO 有矛盾么,你前面说的 new 那部分又是什么呢, Reader.Size()又是什么语法呢? 一个语言的一致性是很重要的。 |
164
WildCat 2016-04-04 11:53:59 +08:00 via iPhone
|
165
plqws 2016-04-04 11:55:52 +08:00
第一次看到 Node.js 节点的帖子上热门榜 hhhhh
我又回来了,关于服务端领域的,我认为 Go 还是比不上 Node , Go 其实本身就已经在走下坡路了,发展速度还不如 JS 的一个分支语言 TypeScript ,就只是因为靠 Docker 续了一命,让这个「语法糟糕,代码丑陋」(主观)的语言重新被人们所重视了… 但是我还是认为 Go 还是会继续不温不火慢慢萎靡下去, Go 我感觉很多人更是拿它当做脚本语言在用…和 Go 并肩的项目一般都是 Python 、 Node 之类的语言, Go 想要蚕食这份市场是不可能的,毕竟 Go 本身的 Native 属性在服务端开发领域的 Debuff 让它有一定的学习门槛, Godoc 之类看起来很不错的功能,仅仅是看起来不错而已,真正用起来会发现「这特么是什么二比设计」…甚至有的库作者认为有了 Godoc 就可以不用写文档了,突然想起来前阵子有一群人批判 JavaScript 程序员这样子那样子,现在想想,真的是呵呵呵呵。 |
166
songjiaxin2008 2016-04-04 12:00:02 +08:00 via iPhone
Go 就是缺少好用的 ORM...
|
167
jjx 2016-04-04 12:10:04 +08:00
@hooluupog @nareix
你们可以说动态语言(我这里主要指 python)做大项目需要对程序员有较高的能力. 因为 python 之类的, 如果不用 django 这样的框架的话, 其项目架构其实是没有强制要求. 这就要求开发者较好的架构能力. 但不能说不能写大于 5k 行的代码, 我这里就不拿我自己的项目举例子了. 好的软件就是东西应该在他本来所在的位置, 做到了这点,就能快速定位并解决, 这同语言无关, 同程序的结构组织有关系, 说白了同开发者有关. 当然, java 通过一些框架和模式了强制开发者去遵守这点, 在用动态语言开发时, 语言和框架通常没有约束, 但不能说开发者会不运用这种能力. 说白了, 用动态语言就会写出不能维护的程序的程序员,本身就是上不了台面的. 其次, 重构, 说白了就是查找替换, 没有工具就不能重构这话肯定不对 动态语言的确会有打错变量名的情况出现, 但这些都是冒烟测试可能解决的, 即运行一下测试程序都能暴露出来的, 其次上大部分问题 linter 程序都能自动识别的. 最头疼的错误是逻辑或误写变量之类的导致数据错误, 这类, 动态语言和编译型语言都必须靠测试解决. 编译型语言没有优势 另外, 我觉得同动态语言不能上 5k 的人沟通实际是有问题, 这不是攻击,是你们对工具依赖的太重, 无法信任人本身的自制和能力, 这两种思维估计很难协调一致. |
168
seaify 2016-04-04 12:14:13 +08:00
翻完了,我大 ruby 木有参战
|
169
zkd8907 2016-04-04 12:17:45 +08:00
路过,围观。 php 是最好的语言!
|
170
88250 2016-04-04 12:27:56 +08:00 1
Go IDE : https://wide.b3log.org
|
171
hooluupog 2016-04-04 12:42:50 +08:00 2
@shyling 可以用来释放资源的(所以说它和 RAII 有相似的地方)。比如打开文件后面要关闭文件。
:= struct{}和:= &struct{}, 一个是值拷贝一个是指针拷贝(如果你觉得拗口,就暂时按引用类型理解, slice , map 这些都可以这么理解),因为有的 struct 可能会非常大,所以为了减少开销,返回一个指针(或者就叫引用吧)。 n := &struct{}和 n := new(struct)是一样的。 的确,省略 new 没省略这个过程,但代码的可读性和连贯性上会大打折扣。 reactive 风格的编程更靠近 FP 语言,在这点上,其实 javascript 比 java 做的要好(JS 比 java 更 FP 一点)。我有个大胆的猜想(java 某一天也会去掉 new ?) user definded 类型确实不支持,其实这就是不支持泛型的问题。 一切皆 OO 的语言几乎都没有指针,而且默认是按引用传递,而系统编程语言比如(c/c++,算半个系统编程语言的 Go)都是按值传递多一点。这也就造成了很多的不同。比如你可以"string".Replace , python 里面你可以直接各种精度的整数相加,因为这些都是一个 int 对象,而不是具体的值类型,是有抽象在里面的。不能说说谁好谁坏,根据不同的使用场景各有自己的优劣,比如做 application 层面的开发, OO 这种引用类型的使用的多一些,而系统编程语言后者多一些,为了性能以及内存开销低一些,比如游戏开发里面甚至会有专门的值类型,比如支持 SIMD 数值类型。 Reader 是一个接口, size()是实现了 Reader 接口的一个方法。 Go 的接口是非侵入式的,组合起来非常自由,但也有很多人吐槽的,不知道谁实现了谁的问题。 @WildCat 非要按照引用类型的本义去理解(比如 c++里的那种),那么 Go 是没有引用类型的,只是 js/python/ruby/java/php 的程序员都不使用指针,都习惯了引用类型,所以 Go 的 map , slice 那些叫引用类型也成。 但 Go 是按值传递,这点和它们有很大的不同,和 c++更接近。比如 c#是两者都支持(有 struct),但却更接近 java/python 。。。这些。 Go 是续命还是萎靡我不做预测,但拿语法丑陋,缺少一大堆特性来说事,我只能说:你到现在还没搞懂: Go 为何会有人在用它。而这篇文章的作者显然是给出了用 Go 的比较靠谱的理由。 docker 再火其实对 Go 本身影响不大,因为大家都在用 docker(各种语言都支持),而不是用 Go 语言其重写一个又一个新的 docker 。而 Go 自身真正吸引一部分人去用它编程的,不是 docker ,而是服务端开发。 最后: Go 现阶段不要盲目的入坑(写些自己的小项目,小工具除外), Go 其实不太适合新手。 Go 作出的一些语法特性上的牺牲和一些妥协只有在工程上,具体项目上能体会到,撞了墙之后才能有深刻体会。不要被 Go 的语法简洁,上手快等等特点给误导。也就是说:不用只看其一面。 希望这不是引战贴,而是解惑贴,各取所需就行了。 |
172
hooluupog 2016-04-04 12:47:55 +08:00 1
@jjx 我没说不能,我只说很麻烦。工具让人变懒是好事,希望有更多这样的工具出现,其实包管理的问题也可以,也应该给通过工具去解决,这种脏活,累活本身就是计算机发明出来该替人做的事,不应该把人的精力和兴趣耗在这些琐碎的事情上。
很高兴的看到,这几年无论是动态语言还是前端,也开始重视静态类型以及工具的作用了。 |
173
hucsmn 2016-04-04 15:05:13 +08:00
用 Go 语言有一段时间了,想说说自己对这门语言的感受。
个人感觉用 Go 最大的好处是包管理、测试、部署、代码组织、代码格式化这些杂七杂八的活儿都被同一套规范暴力而又统一地解决了。这样,程序员可以更侧重于去处理代码逻辑,而不是去操心代码怎么缩进这类细枝末节。另外 Go 的那一套标准库、编译速度以及低学习成本也是它的优势。 Go 的坑主要集中在语言本身对一些机制缺乏支持上,比如泛型,官方自己也承认这一点。还有一些功能在设计的时候也比较欠考虑,比如前面 V 友提到的包管理的版本问题。为了弥补这些问题, Go 后续又搞出了 vendor 、 generate 这些功能很有限的机制。它们虽然能用,但是明显满足不了人们的期待。 目前我主要用 Go 写一些跑在 Linux 服务器上的工具,所以上面这些坑对我来说一般也遇不到,算下来我觉得多学这么一门语言还是非常值得的。 |
174
xhowhy OP @hooluupog 感谢,正面解释了 Go 的很多细节,比我高得不知道多少去了。
@nareix 动态类型和并发编程是 node.js 服务端编程上一直存在的短板,所以才一直在改善,有了 ES6 ,有了 TypeScript ;开发框架也从 express.js 到 koa ,异步编程工具从 async.js 到 co 再到 Promise ,都是为了解决这些问题。 包管理 npm2 到 npm3 也发生了巨大变化,也是为了解决多版本管理的问题。 写过三年的 node.js 服务端代码,所以在看到 Go 的时候,难免会这么想:如果一开始就用 Go 来写,是不是就可以避开 node.js 服务端编程中那些不成熟的坑,不用频繁地切换框架、工具,不用改变编程习惯,不用频繁重构,更高效地编程,把时间完全投入到业务逻辑上而不用各种入坑填坑。 毫无疑问 node.js 生态还是屌屌的,工作中仍会继续使用,也相信坑总有一天坑会填完;也会在个人项目中开始尝试 Go ,体会一下另一种坑的滋味。 |
175
blackboom 2016-04-04 15:09:29 +08:00
并不喜欢 Go 但是 rust 很不错的样子
|
177
ototsuyume 2016-04-04 15:53:20 +08:00
Golang 跟 node.js 的应用场景没多少交集,根本不能直接比较。就拿 Golang 的那些开源项目来看, group cache/docker/Kubernetes/tidb ,这些项目该怎么用 js 来写?语法特性是否优美丰富从来就不是 Golang 的卖点,它最大的卖点是简单没有复杂的语法特性甚至还强迫你们大括号要换行私有变量名要小写,杜绝了各种奇怪难懂的写法,加上丰富易用的工具链,是一种只为实际工程开发做了很多妥协的语言。国内也有不是公司用 Golang 做过线上的服务,比如七牛和领英的赤兔整个后台都是 Golang 写的, bat 也有部分组用 golang 做了不少轻量级的服务,我之前的公司甚至还用 Golang 做了一个类淘宝 TFS 的分布式小文件服务系统和类 hbase 的分布式存储系统。国外 FLAG 乃至 uber/airbnb 都有不少系统是用 Golang 开发的。
另外当年 C/C++在 linux 网络编程里面经常被人垢病的一点就是 linux 多线程性能不高,只能单线程 epoll 配合状态机或者 callback 来写网络服务,导致逻辑支离破碎难以调试,所以 node.js 的 callback 在现在来看是一种倒退。 |
180
m8syYID5eaas8hF7 2016-04-04 20:15:21 +08:00
java 程序员默默飘过,全程围观 :)
|
181
firefox12 2016-04-04 20:23:48 +08:00
golang 的包管理思路是对的, 如果这种大量引用别人类库的东西,就应该作者负责编译出一个可执行的版本,而不是用户去负责。 我拿到一个程序,一运行 需要 200 个依赖包?有些包还找不到? 动态库带来的问题真的很复杂,它解决了大小的问题,带来了更多的麻烦。
|
182
123s 2016-04-05 10:26:21 +08:00
哈哈,成也 callback ,败也 callback 。
以后用 ts 就可以解决类型问题,用 async/await 就可以去掉 callback ,什么?不够优雅?... |
183
xshf12345 2016-04-05 10:30:52 +08:00
我只是静静的看着你们撕逼
|
184
linxl 2016-04-05 11:13:17 +08:00
一定是跟女朋友打赌了,所以才发了这个帖子!
|
185
guanzhong 2016-04-05 11:39:02 +08:00 via Android
好
可以去学习 |
186
guanzhong 2016-04-05 11:39:46 +08:00 via Android
好
可以去学 |
187
MiguelValentine 2016-04-05 14:26:49 +08:00
民科!都是民科!--王垠
|
188
youxiachai 2016-04-05 16:07:18 +08:00
话说..上面那些说 npm 是中心的...要搞清楚 npmjs 和 npm 之间的关系啊...
npm 是可以直接挂 github 地址的....或者某个路径...完全可以去中心化.... |
189
geek123 2016-04-05 16:37:18 +08:00
各有各的好吧。
|
190
Fontaine 2016-04-07 09:10:16 +08:00
不同系统,适用的语言也各有优势嘛
|
191
magicdawn 2016-04-09 20:28:20 +08:00
Node.js 玩家, go 写的少,尝试去实现 go-co , see https://github.com/magicdawn/go-co
有一些见解 1. 没有范型,很不爽。 2. defer panic recover, 其实跟 try catch throw 是一样的,换了个说法,而且 defer 必须先写,想当于 finally 部分最先写。 |
192
magicdawn 2016-04-09 20:32:20 +08:00
返回值写了 interface{}, 如果确实没有返回值,必须显示 return nil
|
193
hpu423 2016-08-29 09:24:51 +08:00
go 最大的问题,下载下来的包,,不能区分版本
|
195
li826049371 2016-09-23 21:40:57 +08:00
golang 能开发什么?不会是像 pyton 强大的语言?
|
196
tkisme 2017-03-30 13:50:24 +08:00
@xiaoyu9527 https://github.com/squeaky-pl/japronto 你听说过 uvloop 么
|
197
yuu2lee4 2018-03-11 16:10:54 +08:00
现在是 async await 的时代了 逃...
|