V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
xhowhy
V2EX  ›  Node.js

粗大事了:花两天时间学习了 Go 语言,发现比 Node.js 高不知多少去了

  •  6
     
  •   xhowhy · 2016-04-03 16:19:20 +08:00 · 54107 次点击
    这是一个创建于 3190 天前的主题,其中的信息可能已经有所发展或是发生改变。

    先说感受到的先进性:

    1. 语法非常简洁,有种在学 C 语言的感觉,学习过程觉得很轻松,没有太陡峭的曲线,但语言也完全够用
    2. 自带工具就非常强大,而且各 IDE 和 Editor 都能集成,开发工具完全不是问题
      • go get = git clone + go install ,从 github 上直接 clone 下源码,编译出 .a 包文件和安装 bin 到 $GOPATH ,就可以本地任意地方使用了。反观 npm ,相信很多人不知道 NODE_PATH 的存在。
      • gofmt 代码风格统一,码农们再也不用为空格与 Tab 争吵了
      • go test 支持 benchmarks 和覆盖率测试
      • godoc 查看文档的工具。支持本地执行 godoc -http=:8080 后就能在浏览器中访问 golang.org 的本地 copy 版,对被墙的同学是个不错的选择
    3. 支持 Github ( Gitlab 等也可以)远程包,不需要发布到类似 npm 那样的地方
    4. 并发用协程和 channel 非常容易写,业务逻辑中可以尽量避免回调
    5. 部署非常简单,可以运行二进制文件,也可以通过 go get 来安装 bin ,运维起来非常方便
    6. API 稳定,据说从发布到现在语法基本没变,只是 Go 内部做了改进和优化
    7. 本人还用 Swift 写过 iOS ,发现 Swift 似乎是从 Go 身上学了不少东西。。

    劣势:

    1. G...FF..WWW ,想下个 pkg 安装文件非常困难,最后是通过 brew 下载的
    2. 国内资料少(这么简单的语言,似乎也不需要什么资料)
    3. 社区小不如 npm ,国内想找个工作更是困难

    不确定性:

    1. 性能与 Java 比如何,相当于什么水平

    综上所述,感觉 Go 确实是一个目前比较理想的开发工具,大家一起讨论讨论,人生苦短,为何不用 go ?

    第 1 条附言  ·  2016-04-03 23:25:43 +08:00
    楼几度歪了,强调下,楼主初衷只是想讨论一下在服务端开发领域 Go 是不是比 Node.js 更合适的工具。。
    不要歪楼提 Node.js 在 Atom 等客户端开发上的建树,更不要乱扣帽子说楼主是在指点江山。。
    可以说说 Node.js 和 Go 互相都好在哪里, Go 到底是不是比 Node.js 更好的选择。。
    197 条回复    2018-03-11 16:10:54 +08:00
    1  2  
    xhowhy
        101
    xhowhy  
    OP
       2016-04-03 21:12:51 +08:00
    @loading 你说得很对啊 我需要你的观点
    xhowhy
        102
    xhowhy  
    OP
       2016-04-03 21:14:13 +08:00
    @loading 你说得对啊 我是想听听你的观点
    xinxu
        103
    xinxu  
       2016-04-03 22:19:20 +08:00
    说了半天没说 goroutine 是什么情况
    bramblex
        104
    bramblex  
       2016-04-03 22:29:31 +08:00   ❤️ 1
    @xhowhy 我就拿 python 写过个三千万日 pv 的。顺便,关于所谓的 callback 我给你科普一下。

    http://lovearia.me/article/show/1
    xhowhy
        105
    xhowhy  
    OP
       2016-04-03 22:35:35 +08:00
    @bramblex 呵呵 用不着你科普 我用 node.js 写过日 pv 八千万的网站。。绝逼不是吹牛
    虽然如此我仍觉得 node.js 的 callback 和 go 的 goroutine + channel 一比就是一坨翔。。而且 go 也支持 callback , callback 这货用来做界面编程还行,用来做并发真不如 goroutine + channel 直观
    xhowhy
        106
    xhowhy  
    OP
       2016-04-03 22:38:53 +08:00
    @xinxu 可以自己去看啊。。改天我撸个典型的场景 看看 async.js 、 co 、 promise 和 go 的各自实现
    edward1992
        107
    edward1992  
       2016-04-03 22:41:59 +08:00
    又来整个大新闻,把 node.js 给批判一番?
    xhowhy
        108
    xhowhy  
    OP
       2016-04-03 22:43:37 +08:00
    不明白为什么有人抱着 callback 当宝不放,不看看外面的世界,这么抵触新的知识和观点。。。 async.js 、 co2.0 、 co 4.0 、 Promise 的存在,不都是为了解决 node callback 在并发业务逻辑处理上的表现力问题吗
    barbery
        109
    barbery  
       2016-04-03 22:51:25 +08:00
    Go 真心是不错的,学习成本很低,性能只能说碉堡。。。唯一不爽的就是 if err != nil
    Wangxf
        110
    Wangxf  
       2016-04-03 22:58:47 +08:00
    Node.js 从来都不是拼语言,我们是拼的生态环境, js 使用者数量大而已
    XIVN1987
        111
    XIVN1987  
       2016-04-03 23:08:12 +08:00
    go 还不支持泛型
    C++、 C#、 JAVA 都支持泛型,新出的其他编程语言也都支持泛型,,就 Go 不支持
    chiu
        112
    chiu  
       2016-04-03 23:08:55 +08:00
    貌似楼主初衷只是想讨论一下服务端领域的 Go 和 Node.js 的应用,怎么就干上了……
    建立楼主 Append 说明下吧 @xhowhy
    xhowhy
        113
    xhowhy  
    OP
       2016-04-03 23:13:41 +08:00
    @Wangxf 说得对,但从语言、工程化角度来看,不知道 Go 是不是一个更好的替代方案
    bramblex
        114
    bramblex  
       2016-04-03 23:22:07 +08:00
    @xhowhy

    呵呵呵, callback 是啥?再说一遍?不懂就不懂,还找借口
    ovear
        115
    ovear  
       2016-04-03 23:25:43 +08:00
    等等。。满屏幕的 callback 是 nodejs 的优雅么。。我记得好像之前还有人在喷 nodejs 回调一多, stackprint 就不完整。。
    superhxnju
        116
    superhxnju  
       2016-04-03 23:34:08 +08:00 via iPhone
    没人黑 Go 没有很好支持范型这点很烦么……还有不能函数重载也是醉了
    xhowhy
        117
    xhowhy  
    OP
       2016-04-03 23:37:13 +08:00
    @bramblex
    你是不是觉得就你牛逼就你懂 callback ? koa 为什么要先后用 yield 和 await 来替代 callback 问题?就是因为复杂的业务逻辑是不适合用 callback 来表达,也不利于调试,所以用 yield 和 await 显著改善了异步代码的开发和调试难度。
    goroutine 和 channel 是啥懂不懂?也建议你看看,开喷前请提高姿势水平,不要为了喷而喷。
    demomaster
        118
    demomaster  
       2016-04-03 23:39:11 +08:00
    C 语言简洁,装的飞起.(*(void)(*)( ) )0)( )求告知
    xhowhy
        119
    xhowhy  
    OP
       2016-04-03 23:39:43 +08:00
    @bramblex 看来哥真的是来给你指点江山的,不谢哈
    kookxiang
        120
    kookxiang  
       2016-04-03 23:41:21 +08:00
    辣鸡 npm
    go 无中心的包管理不会导致 npm 的 left-pad 事件(滑稽
    xhowhy
        121
    xhowhy  
    OP
       2016-04-03 23:44:52 +08:00
    @demomaster 就语法而言, C 语言之父 Dennis 编写的《 C 程序设计语言》就讲完了,就很薄的一本书。语法简洁不代表代码就没有复杂度,同理 lisp 。
    demomaster
        122
    demomaster  
       2016-04-03 23:51:13 +08:00
    @xhowhy Pascal 还 35 页呢,再说了**<<The C Programming Language>>**又不是初学者看的.书薄不代表语言简洁.
    xhowhy
        123
    xhowhy  
    OP
       2016-04-03 23:52:08 +08:00
    @superhxnju 某些 node 社区的人哪里知道什么泛型,就信仰 callback 是宇宙无敌黑科技,听不得别人黑 node ,见不得别人有不同观点。。我日常工作就是搞 node 的,拿 go 出来与 node 比较一下,就被喷成不懂 callback 和装了,呵呵
    nareix
        124
    nareix  
       2016-04-03 23:57:02 +08:00
    恭喜 lz 脱离苦海。动态一时爽,重构火葬场。
    xhowhy
        125
    xhowhy  
    OP
       2016-04-04 00:01:27 +08:00
    @demomaster C 语言语法简洁全世界公认,就你不这么想,你是故意抬杠还是智商捉急呢?
    xhowhy
        126
    xhowhy  
    OP
       2016-04-04 00:02:55 +08:00
    @nareix node.js 也正在往静态上靠呢 服务端开发太需要静态了
    demomaster
        127
    demomaster  
       2016-04-04 00:04:42 +08:00
    @xhowhy 世界公认,给个链接看看? 说两句就人身攻击了,真是智商捉急
    bramblex
        128
    bramblex  
       2016-04-04 00:05:49 +08:00
    @xhowhy

    呵呵,傻 x
    xhowhy
        129
    xhowhy  
    OP
       2016-04-04 00:08:26 +08:00
    xhowhy
        130
    xhowhy  
    OP
       2016-04-04 00:10:07 +08:00
    @demomaster 我先人参攻击?谁一上来不分青红皂白地说别人装呢?哥装用得着你说?你是 @bramblex 猴子派来的逗逼吧,两人一副德行
    demomaster
        131
    demomaster  
       2016-04-04 00:12:00 +08:00
    @xhowhy 给个维基的链接什么意思哦?ctrl+F "简洁"到一个结果,还是说 goto 的
    murmur
        133
    murmur  
       2016-04-04 00:19:51 +08:00
    go lang =够烂
    在宇宙第一语言 php 之前什么都是渣
    (java 属于信仰问题 不在讨论范畴内)
    xhowhy
        134
    xhowhy  
    OP
       2016-04-04 00:24:29 +08:00   ❤️ 1
    @murmur 就喜欢这种喷子 不喜欢某些一上来不喷事先喷人的人 @demomaster @BXIA
    RqPS6rhmP3Nyn3Tm
        135
    RqPS6rhmP3Nyn3Tm  
       2016-04-04 00:49:22 +08:00   ❤️ 1
    @xhowhy 抱歉,为啥要 at 我……
    我只是不明真相的吃瓜群众……
    xhowhy
        136
    xhowhy  
    OP
       2016-04-04 00:54:47 +08:00   ❤️ 1
    @BXIA sorry ,俺错了,你只是碰巧和大喷子 @bramblex 一样,名字都是 b 开头。。
    RqPS6rhmP3Nyn3Tm
        137
    RqPS6rhmP3Nyn3Tm  
       2016-04-04 00:58:46 +08:00   ❤️ 1
    @xhowhy 哇靠吓死了, V 站撕逼请务必不要叫上我……
    hxtheone
        138
    hxtheone  
       2016-04-04 02:02:30 +08:00
    LZ 你这是要搞出个大新闻啊
    Akasha
        139
    Akasha  
       2016-04-04 03:51:16 +08:00
    楼主支持你,新东西需要敞开胸怀去接受
    iannil
        140
    iannil  
       2016-04-04 04:38:44 +08:00
    热闹,占座。
    cuebyte
        141
    cuebyte  
       2016-04-04 07:11:11 +08:00
    夭寿啦,学了两天的 Go 粉来 V 站炸鱼啦!

    请完整写过 1000 行以上的项目再来夸吧, Go 也就算个新时代的 C ,以及 goroutine 不错,其他方面也许还不如 Java 、 C#
    nicevar
        142
    nicevar  
       2016-04-04 08:39:28 +08:00 via Android
    观战
    王大神把 go 批判的一无是处
    shyling
        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 的实现不需要锁?
    zbing3
        144
    zbing3  
       2016-04-04 09:07:40 +08:00
    go 有反射就够了……
    jzfr
        145
    jzfr  
       2016-04-04 09:24:22 +08:00
    嗯,火药味越来越重,撕逼已到高潮,是不是准备开打了?!
    GentleSadness
        146
    GentleSadness  
       2016-04-04 09:34:34 +08:00
    @demomaster (*(void)(*)( ) )0)( ),(void)(*)()无返回类型的指向函数的指针 1 ?(*(void)(*)( ) ) *是指向前面那块东西的指针 2 ? (*(void)(*)( ) )0) 默认值是 0 ? 最后那个 () 函数调用?
    demomaster
        147
    demomaster  
       2016-04-04 09:40:12 +08:00
    @GentleSadness 计算机启动时,硬件调用首地址为 0 位置的子例程.
    kslr
        149
    kslr  
       2016-04-04 09:50:48 +08:00
    一些人真是太狭隘了,语言还不是拿来用的
    anonymityl
        150
    anonymityl  
       2016-04-04 10:19:16 +08:00
    私以为楼主如果真想讨论,何必取个这样的标题。
    zhuangzhuang1988
        151
    zhuangzhuang1988  
       2016-04-04 10:19:46 +08:00
    你们吵架好厉害,我还是静静的学 F#/C#/Typesciprt
    xiaoyu9527
        152
    xiaoyu9527  
       2016-04-04 10:30:09 +08:00   ❤️ 3
    我学 ASP 的时候 你们说 PHP 不知道牛逼到哪里去了
    我学 PHP 的时候 你们说 PYTHON 不知道牛逼到哪里去了
    我学 PYTHON 的时候 你们说 NODE.JS 不知道牛逼到哪里去了
    我学 NODEJS 的时候 你们又说 GO 不知道牛逼到哪里去了
    nareix
        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 基本都是一个情况。
    realsteve
        154
    realsteve  
       2016-04-04 10:39:33 +08:00 via iPhone
    求楼主这个 css
    hooluupog
        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).
    chiu
        156
    chiu  
       2016-04-04 11:06:10 +08:00
    @demomaster 说 C 的 语法 简洁,没问题啊
    jjx
        157
    jjx  
       2016-04-04 11:20:41 +08:00
    每次看到动态语言项目不能大于 5k 行言论就感到莫名的喜感, 开发者的结构能力, 设计能力到哪里去了, 没有编译型语言的支持, 连大于 5k 行的项目都做不了, 真真是可笑的很.
    jsyangwenjie
        158
    jsyangwenjie  
       2016-04-04 11:32:25 +08:00
    不觉得你这个标题是来好好讨论的标题
    levn
        159
    levn  
       2016-04-04 11:33:43 +08:00 via iPad
    果然这种帖子最火。。。
    arden
        160
    arden  
       2016-04-04 11:37:35 +08:00
    要我再做一次选择,我应该不会选 nodejs 来做项目了,折腾过得出来的经验。
    nareix
        161
    nareix  
       2016-04-04 11:39:10 +08:00
    @jjx 硬要写当然能写,但时间精力耗费怎么算
    hooluupog
        162
    hooluupog  
       2016-04-04 11:44:11 +08:00
    @nareix 写问题不大,最麻烦的是重构。
    shyling
        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()又是什么语法呢?
    一个语言的一致性是很重要的。
    WildCat
        164
    WildCat  
       2016-04-04 11:53:59 +08:00 via iPhone
    @hooluupog 说的挺好。

    不过 The Go Programming Language 里面说 slice 、 map 都是 reference type 啊
    plqws
        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 程序员这样子那样子,现在想想,真的是呵呵呵呵。
    songjiaxin2008
        166
    songjiaxin2008  
       2016-04-04 12:00:02 +08:00 via iPhone
    Go 就是缺少好用的 ORM...
    jjx
        167
    jjx  
       2016-04-04 12:10:04 +08:00
    @hooluupog @nareix

    你们可以说动态语言(我这里主要指 python)做大项目需要对程序员有较高的能力. 因为 python 之类的, 如果不用 django 这样的框架的话, 其项目架构其实是没有强制要求. 这就要求开发者较好的架构能力. 但不能说不能写大于 5k 行的代码, 我这里就不拿我自己的项目举例子了. 好的软件就是东西应该在他本来所在的位置, 做到了这点,就能快速定位并解决, 这同语言无关, 同程序的结构组织有关系, 说白了同开发者有关. 当然, java 通过一些框架和模式了强制开发者去遵守这点, 在用动态语言开发时, 语言和框架通常没有约束, 但不能说开发者会不运用这种能力. 说白了, 用动态语言就会写出不能维护的程序的程序员,本身就是上不了台面的.

    其次, 重构, 说白了就是查找替换, 没有工具就不能重构这话肯定不对

    动态语言的确会有打错变量名的情况出现, 但这些都是冒烟测试可能解决的, 即运行一下测试程序都能暴露出来的, 其次上大部分问题 linter 程序都能自动识别的. 最头疼的错误是逻辑或误写变量之类的导致数据错误, 这类, 动态语言和编译型语言都必须靠测试解决. 编译型语言没有优势


    另外, 我觉得同动态语言不能上 5k 的人沟通实际是有问题, 这不是攻击,是你们对工具依赖的太重, 无法信任人本身的自制和能力, 这两种思维估计很难协调一致.
    seaify
        168
    seaify  
       2016-04-04 12:14:13 +08:00
    翻完了,我大 ruby 木有参战
    zkd8907
        169
    zkd8907  
       2016-04-04 12:17:45 +08:00
    路过,围观。 php 是最好的语言!
    88250
        170
    88250  
       2016-04-04 12:27:56 +08:00   ❤️ 1
    hooluupog
        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 的语法简洁,上手快等等特点给误导。也就是说:不用只看其一面。

    希望这不是引战贴,而是解惑贴,各取所需就行了。
    hooluupog
        172
    hooluupog  
       2016-04-04 12:47:55 +08:00   ❤️ 1
    @jjx 我没说不能,我只说很麻烦。工具让人变懒是好事,希望有更多这样的工具出现,其实包管理的问题也可以,也应该给通过工具去解决,这种脏活,累活本身就是计算机发明出来该替人做的事,不应该把人的精力和兴趣耗在这些琐碎的事情上。
    很高兴的看到,这几年无论是动态语言还是前端,也开始重视静态类型以及工具的作用了。
    hucsmn
        173
    hucsmn  
       2016-04-04 15:05:13 +08:00
    用 Go 语言有一段时间了,想说说自己对这门语言的感受。
    个人感觉用 Go 最大的好处是包管理、测试、部署、代码组织、代码格式化这些杂七杂八的活儿都被同一套规范暴力而又统一地解决了。这样,程序员可以更侧重于去处理代码逻辑,而不是去操心代码怎么缩进这类细枝末节。另外 Go 的那一套标准库、编译速度以及低学习成本也是它的优势。
    Go 的坑主要集中在语言本身对一些机制缺乏支持上,比如泛型,官方自己也承认这一点。还有一些功能在设计的时候也比较欠考虑,比如前面 V 友提到的包管理的版本问题。为了弥补这些问题, Go 后续又搞出了 vendor 、 generate 这些功能很有限的机制。它们虽然能用,但是明显满足不了人们的期待。
    目前我主要用 Go 写一些跑在 Linux 服务器上的工具,所以上面这些坑对我来说一般也遇不到,算下来我觉得多学这么一门语言还是非常值得的。
    xhowhy
        174
    xhowhy  
    OP
       2016-04-04 15:05:17 +08:00
    @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 ,体会一下另一种坑的滋味。
    blackboom
        175
    blackboom  
       2016-04-04 15:09:29 +08:00
    并不喜欢 Go 但是 rust 很不错的样子
    aphasia
        176
    aphasia  
       2016-04-04 15:31:34 +08:00 via iPhone
    @nareix 在理,动态语言在大规模项目开发容易,多个版本迭代下来,维护起来好麻烦的
    ototsuyume
        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 在现在来看是一种倒退。
    timothyye
        178
    timothyye  
       2016-04-04 16:19:31 +08:00
    @xhowhy 不是说 Go 坑,欢迎入坑,是欢迎加入 Gopher 的队列,哈哈
    shyling
        179
    shyling  
       2016-04-04 17:51:16 +08:00
    @hooluupog 为什么你可以举着 C++的例子把他放到不 OO 那里了啊。。。而且不能++--的指针有什么用=-=
    m8syYID5eaas8hF7
        180
    m8syYID5eaas8hF7  
       2016-04-04 20:15:21 +08:00
    java 程序员默默飘过,全程围观 :)
    firefox12
        181
    firefox12  
       2016-04-04 20:23:48 +08:00
    golang 的包管理思路是对的, 如果这种大量引用别人类库的东西,就应该作者负责编译出一个可执行的版本,而不是用户去负责。 我拿到一个程序,一运行 需要 200 个依赖包?有些包还找不到? 动态库带来的问题真的很复杂,它解决了大小的问题,带来了更多的麻烦。
    123s
        182
    123s  
       2016-04-05 10:26:21 +08:00
    哈哈,成也 callback ,败也 callback 。
    以后用 ts 就可以解决类型问题,用 async/await 就可以去掉 callback ,什么?不够优雅?...
    xshf12345
        183
    xshf12345  
       2016-04-05 10:30:52 +08:00
    我只是静静的看着你们撕逼
    linxl
        184
    linxl  
       2016-04-05 11:13:17 +08:00
    一定是跟女朋友打赌了,所以才发了这个帖子!
    guanzhong
        185
    guanzhong  
       2016-04-05 11:39:02 +08:00 via Android

    可以去学习
    guanzhong
        186
    guanzhong  
       2016-04-05 11:39:46 +08:00 via Android

    可以去学
    MiguelValentine
        187
    MiguelValentine  
       2016-04-05 14:26:49 +08:00
    民科!都是民科!--王垠
    youxiachai
        188
    youxiachai  
       2016-04-05 16:07:18 +08:00
    话说..上面那些说 npm 是中心的...要搞清楚 npmjs 和 npm 之间的关系啊...

    npm 是可以直接挂 github 地址的....或者某个路径...完全可以去中心化....
    geek123
        189
    geek123  
       2016-04-05 16:37:18 +08:00
    各有各的好吧。
    Fontaine
        190
    Fontaine  
       2016-04-07 09:10:16 +08:00
    不同系统,适用的语言也各有优势嘛
    magicdawn
        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 部分最先写。
    magicdawn
        192
    magicdawn  
       2016-04-09 20:32:20 +08:00
    返回值写了 interface{}, 如果确实没有返回值,必须显示 return nil
    hpu423
        193
    hpu423  
       2016-08-29 09:24:51 +08:00
    go 最大的问题,下载下来的包,,不能区分版本
    AWSAM
        194
    AWSAM  
       2016-09-03 01:59:13 +08:00
    @hpu423 用 glide 就可以啦
    li826049371
        195
    li826049371  
       2016-09-23 21:40:57 +08:00
    golang 能开发什么?不会是像 pyton 强大的语言?
    tkisme
        196
    tkisme  
       2017-03-30 13:50:24 +08:00
    yuu2lee4
        197
    yuu2lee4  
       2018-03-11 16:10:54 +08:00
    现在是 async await 的时代了 逃...
    1  2  
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2754 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 03:50 · PVG 11:50 · LAX 19:50 · JFK 22:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.