V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
gouchaoer
V2EX  ›  程序员

对《为什么说 2017 年你必须要学习 Go 了》这篇文章的疑惑

  •  8
     
  •   gouchaoer · 2017-01-14 13:48:11 +08:00 · 25929 次点击
    这是一个创建于 2904 天前的主题,其中的信息可能已经有所发展或是发生改变。

    前几天被一篇文章《为什么说 2017 年你必须要学习 Go 了》刷屏了,我原本也学过一点这门很火的语言但是没有真正用过,于是点进去看了下觉得功利+不靠谱。码农闻到了 bad smile 就是不吐不快,今天来战一战 go 语言吧。

    第一段大篇幅写“硬件限制”,讲对多核的利用+对 cpu 高效率利用多么重要,的确这个很重要,各语言肯定都在追求做好这件事。

    第二段讲 goroutine ,我觉得 goroutine 是好东西但是和多线程比肯定不行啊, goroutine 本质上是把异步回调的代码用同步的方式来写(语言底层处理了细节,所以性能上和异步回调并没有差别),你要比和 libevent 之类的异步事件库比啊;而且你黑 python 多线程也就完了, java 的多线程那么好那么工业级的东西。实际上 goroutine 的确比异步回调写起来容易了,单身业务逻辑多线程同步方法写肯定是最简单的。那个( Beautiful,straight code/Efficient concurrency )表严重不同意,静态类型的 c/c++和 java 在可读性上会比 erlang 、 clojure 差么,会和 js 、 perl 、 python 这些脚本语言在一个层次上么?而且性能还要看场景的,你这么钦定了真的好么。

    第三段 go 可以编译成二进制的确很震撼,不过既然没有消灭 gc ,那你说 go 的是一个 runtime 不是虚拟机我也无话可说。然后讲 go 的性能怎么不提 gc 了, rust 也是编译成二进制消灭 gc 消灭 malloc/free 的。

    第四段讲 go 代码容易维护,举了一堆 go 没有的特性然后来把这个当 feature ,我觉得很搞笑。然后 Go 和其他语言非常不同这一点我承认,但是这也是我学习 go 的时候非常不适应的原因。我觉得一个语言最珍贵的品质应该是解决问题而不是与众不同的语法,在我这个 go 初学者眼里 go 除了编译成无依赖二进制和 goroutine 这 2 个杀手级 feature 以外,作为一个开发者我看不到它有别的创新,甚至有很多业界广泛使用的 feature 没有做。我学过语言也学了半打了吧,我很烦一些编程语言搞一些特立独行的语法,如果你这个语法没有带来新的 feature 那么老老实实学 c/c++或者 java 就完了嘛, go 语言看起来丑说到底还是语法想搞的特立独行。

    然后我比较同意的是他把 Go 的兼容性拿来说了一下,这也是我非常看重的。另外代码维护就不得不提第三方库管理机制吧?

    最后说 GO 的背后是 google ,这个潜意识不就是社区驱动的语言不如大公司驱动的语言么,我认为这是非常功利的说法。 mysql 背后就是大公司, postgresql 背后就社区,二者都做的很好,而 google 为啥还迁出 mysql ; java 背后还是 sun 是 oracle 呢,微软和 google 不是还被恨咬过么。实际上一项基础设施技术一个大公司主导好不好这个还是不好说,大公司投入肯定好,但是大公司为了自身业务有的情况会和社区有分歧,实际上 go 官方对社区的意见就没有社区驱动的 rust 重视嘛( rust 由 mozilla 公司驱动)。 Facebook 为了满足自身也无需要弄出了 hack 也没法强加到 php 身上,因为基础设施肯定要服务大多数开发者。

    我个人就是个土包子喜欢实用皮实的技术,我讨厌装逼的技术 /工具 /库 /语言,对我来说啥是装逼的技术呢? 重复造轮子,把自己包装的逼格很高,忽视兼容性,性能差,和业界现有的工作缺乏继承关系,故意弄得不兼容。

    116 条回复    2018-08-30 17:24:21 +08:00
    1  2  
    k9982874
        1
    k9982874  
       2017-01-14 13:53:59 +08:00 via iPhone
    只有 google 不把 android 都开发语言换成 go , go 到 2027 年也主流不了
    SuperFashi
        2
    SuperFashi  
       2017-01-14 14:14:37 +08:00 via Android   ❤️ 1
    最后一段的前 9 个字是我的回复。
    undeflife
        3
    undeflife  
       2017-01-14 14:21:09 +08:00   ❤️ 4
    "我对 go 没什么意见,但是一些 go 吹挺惹人厌的."
    echo1937
        4
    echo1937  
       2017-01-14 14:55:36 +08:00 via iPhone
    个人比较感兴趣的是:编译成无依赖二进制和 goroutine ;烦的是有些无脑吹。

    未来混合语言编程是主流…
    aksoft
        5
    aksoft  
       2017-01-14 15:05:07 +08:00
    装逼让雷劈
    gamexg
        6
    gamexg  
       2017-01-14 15:08:16 +08:00 via Android
    网关类服务,单机几 w 同时在线,日请求几千万。
    程序基本没做优化,轻松就达到了预期目的。
    至少我知道的语言都需要写成回调模式才能达到要求。( python 有一个库也能达到)

    缺陷是至今 windows 还不原生支持编译成动态库,怎么和现有系统集成?
    图形界面看官方是不打算提供支持了。
    另外语言上还缺失泛型。
    youngsterxyf
        7
    youngsterxyf  
       2017-01-14 15:08:58 +08:00
    第 1 、 2 点楼主理解错误。
    zwh8800
        8
    zwh8800  
       2017-01-14 15:12:27 +08:00   ❤️ 2
    你对 goroutine 的理解错了。

    goroutine 并不是 “把异步回调的代码用同步的方式来写”。而是在用户空间实现了一个 M 对 N 的调度器。

    简单来讲,异步回调一般只开一个线程,有任务了之后会把让这个线程去执行这个任务,无法利用多核。

    而 goroutine 会根据机器的运行情况开 N 个操作系统级别的线程,然后把 M 个用户级别的 goroutine 调度到这 N 个线程上。

    golang 团队一直引以为傲的就是这个 M 对 N 的调度器,这种 M 对 N 调度器在业界也算是比较先进的。
    linboki
        9
    linboki  
       2017-01-14 15:13:21 +08:00   ❤️ 6
    喷还是赞?谁出来带带风向,我怕站错队
    zwh8800
        10
    zwh8800  
       2017-01-14 15:17:44 +08:00
    @echo1937 “编译成无依赖二进制”确实是一个很大的优点,大大减轻了部署负担。我见过有的 java 项目光部署脚本就写了好几百行。 c/c++项目更别说了,安装依赖就够喝一壶的了。就算是 python , php 这种脚本,部署时安装各种扩展也得考虑不同版本系统有没有对应版本的软件包。

    golang 做部署的话基本上就是简单的复制粘贴操作。
    liuzhen
        11
    liuzhen  
       2017-01-14 15:19:11 +08:00   ❤️ 3
    直接喷还是走程序?
    sagaxu
        12
    sagaxu  
       2017-01-14 15:21:40 +08:00
    几天就能上手的东西,合适的地方就拿来用了,不需要那么多突出的理由的。最近我还顺手学了 kotlin ,把一些新的功能用这个实现了,感觉比 Java 少写了不少代码,写起来也更加的舒服了。如果有需要,一个项目用十种不同语言做 各自适合的事情,也未尝不可。
    mazyi
        13
    mazyi  
       2017-01-14 15:22:51 +08:00
    文字是文字,技术是技术

    文字的观点可能不对,毕竟圈子大了就混杂了,特别是这种标题党,自动屏蔽。

    可是 go 语言确实发展比较不错,后面怎么样,看 google 爸爸的了。
    backing
        14
    backing  
       2017-01-14 15:24:37 +08:00
    lz 太激动啦,想要喷的令人幸福,需要冷静一点
    neoblackcap
        15
    neoblackcap  
       2017-01-14 15:26:47 +08:00
    @zwh8800 其实就是用户态线程, erlang 也有。记得 FreeBSD 也有过 M : N 的线程模型,后来发现 bug 多于是就砍了换成 1 : 1 。
    M : N 初看是挺好,但是真的会比 1:1 模型强吗?我是表示怀疑的,在复杂的负载下,我认为系统的调度很有可能比用户自己调度好。
    mengskysama
        16
    mengskysama  
       2017-01-14 15:37:34 +08:00
    goroutine 是个很神奇的东西,他的调度能在行级,不是简单的 yield 一下就做到的。这种特性可以保证某个线程不会被拿不到资源被饿死。我也不相信 java 用线程模型造出来的东西性能可以好到哪里。

    go 用下来最让人不满意的一点倒是官方的包管理工具,被 npm 甩几条街。
    qwer1234asdf
        17
    qwer1234asdf  
       2017-01-14 15:38:42 +08:00
    一拨人出来开个讲座或者沙龙,然后,各个论坛就开始热议 xxx 语言要火了, xx 语言要取代 xxx 语言了。。。过一段时间又沉寂下去了。。。然后,过了一段时间又有类似的活动了,于是这波热议又开始了。。。
    不过,语言还是那些语言。。。程序员还是那些程序员。。搬砖还是继续。。。
    gouchaoer
        18
    gouchaoer  
    OP
       2017-01-14 15:52:57 +08:00 via Android
    @zwh8800 我问个问题, go 的所有 io 操作(包括数据库查询, socket ,文件等)是不是没有阻塞的说法,一旦进入等待马上让出 cpu 给别的协程,等 io 的数据返回了协程调度又恢复执行了呢?
    oyjc
        19
    oyjc  
       2017-01-14 15:57:14 +08:00
    初时看上 go ,是因为 COPY 部署很方便。
    特别是分发程序给其他人用(不用管他用什么系统),
    很爽,直接拷着走,跟 DOS 年代似的,拷个 EXE 就能到处跑了。

    后来用着用着感觉不是很爽,
    1,语法虽简单,但感觉说不上的不舒服;
    2,没用的变量也不能存在,不方便反复修改调试;
    3,其它。。。

    正好看到 .Net Core 开源,然后拥抱 C#,
    现在可以 XCOPY 部署 EXE 文件夹,未来计划可以生成 Native 单一 EXE 文件。

    什么异步回调/多线程啥的,挺舒服。

    如果追求简单原则的话,预计 2017 年, WebAssembly 初步可用,届时, JavaScript 我也不想要了,
    直接 C# 搞定前后端。
    gouchaoer
        20
    gouchaoer  
    OP
       2017-01-14 16:03:59 +08:00 via Android
    @zwh8800 我这么理解 go 行么, N 个服务器 cpu 调度 M 个协程同时能运行的只有 N 个协程,而且 go 的所有 io 函数都没有阻塞,协程之间切换消耗可以很低,也就是说 N 个 cpu 在任何时候都在处理业务或者协程切换;如果别的语言比如 nodejs 的异步写法要达到 go 的效率必须满足 2 个条件,第一是开 N 个 nodejs 进程来利用所有 cpu ,第二是 nodejs 的所有 io 操作必须是回调写法(当然了回调写很复杂),而且现在有的语言开始尝试把 io 操作改造成协程的方式比如 php 的 swoole 。
    sagaxu
        21
    sagaxu  
       2017-01-14 16:09:32 +08:00
    @gouchaoer swoole 的 coroutine 写起来比 go 还麻烦,且只能调用 swoole 封装好的东西,一旦调用到其它阻塞型 php 库,立刻失去 coroutine 的能力。所有的半路支持 coroutine 的语言,都有兼容现有库的问题, node 和 go 这样的,没有历史包袱,但是换句话说,库也没有那么丰富。
    spice630
        22
    spice630  
       2017-01-14 16:09:41 +08:00
    你大概不喜欢 C
    gouchaoer
        23
    gouchaoer  
    OP
       2017-01-14 16:13:48 +08:00 via Android
    @sagaxu node 哪里天生支持协程了,都回调地狱吧
    jmp2x
        24
    jmp2x  
       2017-01-14 16:16:22 +08:00
    @zwh8800 说的蛮好的, 第一点可以解决 py 不能打满多核. 对于这种协程实现原理大致相同, 就是模拟线程切换, 只不过对于 tornado 这类是需要用户去判断什么时候切换, gevent 只是对 所有的 socket io 进行了 patch, 对于 go 而言, 也就是 @gouchaoer 的疑问, golang 对内部所有可能的阻塞系统调用都做了封装, 当遇到可能发生阻塞的系统调用自动切换, 关于这方面可以浏览相关 goroutine 切换原理.

    对于 @zwh8800 说的第二点有一点小感触就是, 利用 docker 实现跨平台编译, Mac 上开发好后直接用 docker 进行编译, 然后扔到服务器就好.
    spice630
        25
    spice630  
       2017-01-14 16:18:08 +08:00
    那篇文章没什么毛病,只是标题有点武断,是楼主自己不小心中了圈套~~~
    sagaxu
        26
    sagaxu  
       2017-01-14 16:20:19 +08:00   ❤️ 1
    @gouchaoer node 虽然没有 coroutine ,但是天生无阻塞啊。而且 js 引入了 async 和 await ,层层回调的写法,马上就要成为过去式了。
    monsoon
        27
    monsoon  
       2017-01-14 16:48:21 +08:00   ❤️ 5
    楼主无视这种文章好了,其实这只是一种营销性吸引开发者学 Golang 的文章,看了下文章还有讲没有范型代码容易维护的……

    刚刚我写了好几篇推广的软文!

    为什么说 2017 年你必须要学习 C 了
    C 语言,用的这么广的工业级语言你都不会,世界上牛逼的操作系统之一就是 C 语言学的, fuck nvidia , 2017 年你必须要学习了!

    为什么说 2017 年你必须要学习 Java 了
    Google 都在用 Java ,世界上市场份额最大的手机系统就是用 Java 写程序的, Minecraft 都是用 Java 写的,你竟然还不会还在这里悠哉地看这些文章, 2017 年你必须要学习了!

    为什么说 2017 年你必须要学习 JS 了
    在浏览器上吊打其他语言的语言你都不会, 2017 年你必须要学习了!

    为什么说 2017 年你必须要学习 Typescript 了
    JS 的超集,由微软这么牛逼的公司推广、 Anders Hejlsberg 怎么牛逼的开发者开发的语言, 2017 年你必须要学习了!

    为什么说 2017 年你必须要学习 Haskell 了
    最牛逼的 fp 的语言之一你都不会,你连 fp 都不懂,怎么装逼, 2017 年你必须要学习了!

    为什么说 2017 年你必须要学习 Rust 了
    hack 看了会顿悟,系统级编程爱好者看了会流泪,这么牛逼的语言…………
    monsoon
        28
    monsoon  
       2017-01-14 16:55:43 +08:00
    上面打错字了( sorry
    范型 -》 泛型
    WittBulter
        29
    WittBulter  
       2017-01-14 17:00:07 +08:00
    @monsoon hack 看了会顿悟,系统级编程爱好者看了会流泪。。。 笑出声
    gamexg
        30
    gamexg  
       2017-01-14 17:02:28 +08:00 via Android
    @gouchaoer 文件操作至少 windows 是直接使用的系统阻塞调用,但是 go 运行时会自动再启动一个系统线程来提供给其他 go 协程,所以可以当作是。
    gamexg
        31
    gamexg  
       2017-01-14 17:05:15 +08:00 via Android
    @neoblackcap 开几 w 系统线程操作系统受不了啊。。。
    majinjing3
        32
    majinjing3  
       2017-01-14 17:06:45 +08:00 via Android
    楼主说自己土包子,还真说对了,最后一段话,赤裸裸的打脸的感觉, go 哪装逼了?哪忽视兼容性了?性能差?缺乏继承关系?故意不兼容?
    ruooooooli
        33
    ruooooooli  
       2017-01-14 17:08:34 +08:00
    我是个 golang 的新手 大概用了一段时间 我感觉挺好的 哈哈哈 还没到各位大神的境界
    youngsterxyf
        34
    youngsterxyf  
       2017-01-14 17:11:47 +08:00
    @youngsterxyf 纠正一下,是楼主对 2 、 3 点理解错了。
    cuebyte
        35
    cuebyte  
       2017-01-14 17:13:07 +08:00
    go 语言本身没大问题,就烦那些 go 吹。
    wangxn
        36
    wangxn  
       2017-01-14 17:21:44 +08:00
    bad smile -> bad smell
    Vanessa
        37
    Vanessa  
       2017-01-14 17:23:35 +08:00
    欢迎各位大神前来学习,可在线编辑运行学习 golang 哦 https://hacpai.com/article/1437497122181
    neoblackcap
        38
    neoblackcap  
       2017-01-14 17:29:17 +08:00
    @gamexg 据我了解,主流的操作系统也就只有 windows 可以读写文件达到也达到异步, IO 操作请使用 windows 特有的 IOCP
    zwh8800
        39
    zwh8800  
       2017-01-14 18:01:53 +08:00
    @gouchaoer : golang 里想要调用阻塞的系统调用也是有方法的,直接调用 syscall 包里的函数或者用 Cgo 包一层。

    @neoblackcap :关键是新手玩家玩线程会很要命,我见过有的安卓项目最多开了上千个线程的(每下载一个图片开一个),这样系统肯定吃不消。

    老手的话, M : N 和 1:1 都能玩转了。

    我个人感觉自己水平不到家,还是玩 golang 吧😄
    hjc4869
        40
    hjc4869  
       2017-01-14 18:34:39 +08:00 via Android
    linboki
        41
    linboki  
       2017-01-14 18:43:09 +08:00 via Android
    @neoblackcap epoll + 线程池 + eventfd 可以封装出和 iocp 一样的接口,但内在区别就是一个在内核等 io 事件,一个在用户态等
    zonyitoo
        42
    zonyitoo  
       2017-01-14 18:48:57 +08:00
    @zwh8800
    > c/c++项目更别说了,安装依赖就够喝一壶的了。

    其它的我先不评论。光说这个,你有部署过 C/C++项目么?你知道 C/C++项目也是 static link 然后一个 binary 直接 rsync 上去的么?
    neoblackcap
        43
    neoblackcap  
       2017-01-14 18:57:27 +08:00
    @linboki 这就很大区别了,一个是内核可以感知,一个是内核不能感知。那么怎么调度?你用户态堵塞的时候,我内核到底要不要挂起该进程?
    zwh8800
        44
    zwh8800  
       2017-01-14 18:59:38 +08:00
    @zonyitoo 没部署过。但见过/听说过游戏公司 server 怎么搞,并不是所有的公司都是 static 的。有的 server 还部署在 windows 上,带一堆 dll
    linboki
        45
    linboki  
       2017-01-14 19:13:15 +08:00 via Android
    @neoblackcap 网络 io 用非阻塞 epoll 等&执行(开一条新线程,磁盘 io 直接放线程池调度,主线程无任何阻塞
    gouchaoer
        46
    gouchaoer  
    OP
       2017-01-14 19:13:58 +08:00
    @monsoon 阿汁你发散思维真强
    @majinjing3 我只是总结了一下,除了 go 以外很多技术 /工具 /库 /语言有这个些毛病中的几点,至于 go 的问题我前面也说了。

    @hjc4869 垠神已经疯了,你看他质疑 911 的那篇
    scnace
        47
    scnace  
       2017-01-14 19:21:54 +08:00 via Android   ❤️ 2
    什么? Golang 也要加入圣战了?所以 为什么要安利别人学 Go 自己觉得好用就行了啊…… 强行安利感觉会污染 Gopher 圈子 开 Goroutine 也需要谨慎啊 线程间切换也是有代价的…… 说白了 Goroutine 并不是严格意义上的多线程 但是还是很好用就是了…
    ```golang
    if err!=nil{
    return err
    }
    ```
    这次怎么没人说 golang 的错误处理了(逃
    spice630
        48
    spice630  
       2017-01-14 19:23:51 +08:00
    @cuebyte
    请 block 我
    cyr1l
        49
    cyr1l  
       2017-01-14 19:39:29 +08:00 via iPhone
    觉得 swift 跟 go 挺像的,但是 swift 的老大都去特斯拉做自动导航了。
    alexsunxl
        50
    alexsunxl  
       2017-01-14 19:58:34 +08:00
    @cyr1l 搞 compiler 么有搞 ai 好玩么 23333
    JamesRuan
        51
    JamesRuan  
       2017-01-14 20:08:09 +08:00   ❤️ 1
    怎么没有人提 CSP ?
    没 CSP 的 channel 去写 goroutine 和写 C++差别也没有特别大。系统级别同步原语都能用,就看有没有必要去使用了。

    怎么没人提工具链?语言诞生之初就具备如此丰富的工具链还是非常少见的。举个例子: debug 时可以通过 HTML 暴露程序内部状态,比如说一共有多少个 goroutine 在跑,他们各自的调用栈和当前的状态。这类调试方式也就在 Erlang 这样的语言见过。其他语言你开一堆多线程,还要手动去维护他们的状态,调试起来就够你喝一壶了。
    liujiangbei
        52
    liujiangbei  
       2017-01-14 20:18:26 +08:00
    楼主又来引口水。。。
    hjc4869
        53
    hjc4869  
       2017-01-14 21:05:30 +08:00
    @gouchaoer 写这篇文章的时候他的文章还挺正常的
    mengzhuo
        54
    mengzhuo  
       2017-01-14 21:30:00 +08:00
    @scnace 这个错误处理很工程啊
    就算是 python 的生产级代码也是要处理多种错误的
    firefox12
        55
    firefox12  
       2017-01-14 22:03:38 +08:00
    我用 go 和 c++ 都可以写单机百万的程序,但是 go 要简洁很多,起 100 万个 goroutine 也没有问题。 go 的问题是 缺少完整的生态链。但是我觉得在后端会很多有机会。
    chenqh
        56
    chenqh  
       2017-01-14 22:09:30 +08:00
    @sagaxu 只是语法可以 async,await 了而言,第三方库呢
    sagaxu
        57
    sagaxu  
       2017-01-14 22:12:49 +08:00
    @chenqh 因为 js 天生异步,很多库都返回的 promise ,前面加个 async 就支持了,工作量小很多
    chenqh
        58
    chenqh  
       2017-01-14 22:19:52 +08:00
    @sagaxu 然而老子是菜鸟呀,看 promise 看得脑子晕得要死,更不要说好多库都不支持 promise 了
    loqixh
        59
    loqixh  
       2017-01-14 22:35:10 +08:00
    c# 的 async,await 也是 N:M, 还可以自定义成 1:1
    sagaxu
        60
    sagaxu  
       2017-01-14 22:42:26 +08:00
    我倒是更看好 JVM 上的 kotlin ,它是个不啰嗦版 Java 。跟 Java 无缝集成,充分利用现有的 Java 库是很大的优势。它的 coroutine 也即将出炉,而且官方也支持编译输出成 JavaScript ,可玩性很强。
    Brucepac
        61
    Brucepac  
       2017-01-14 22:47:44 +08:00
    我想知道楼主怎么评价 swift
    88250
        62
    88250  
       2017-01-14 22:48:07 +08:00
    多说无益,来练练手吧: https://wide.b3log.org/playground
    xcodebuild
        63
    xcodebuild  
       2017-01-14 22:54:20 +08:00
    @chenqh 不支持封装一层也非常容易,而且现在新出的库少有不支持的,这貌似完全不是难点吧。。。
    cuebyte
        64
    cuebyte  
       2017-01-14 22:59:02 +08:00
    @spice630 谢谢你,已 B
    chenqh
        65
    chenqh  
       2017-01-14 23:12:15 +08:00
    @codefalling 是难点……对于我这种刚准备学 nodejs 的人来说,没有享受到一点好处,就被喂了一堆屎
    chenqh
        66
    chenqh  
       2017-01-14 23:13:14 +08:00
    @zwh8800 你们的并发都那么高的吗?我也想我能有一天需要用 golang 的日子……
    xcodebuild
        67
    xcodebuild  
       2017-01-14 23:19:29 +08:00
    @cuebyte 哈哈哈这人早 B 掉了,你要不诶特我都看不到
    scnace
        68
    scnace  
       2017-01-14 23:26:46 +08:00
    @mengzhuo 我也觉得挺好的 能尽快捕获错误。。
    missdeer
        69
    missdeer  
       2017-01-14 23:27:10 +08:00   ❤️ 1
    大多数喷 Go 这不好那不行的人基本上对软件工程一无所知,或者是没负责过大规模的开发项目的。不然应该能体会到 Go 一些看似莫名其妙的设计是多么的贴心,比如 lz 说的变量不使用就不能编译过。
    bash99
        70
    bash99  
       2017-01-15 00:00:13 +08:00
    更好的 c
    weiweiwitch
        71
    weiweiwitch  
       2017-01-15 00:01:07 +08:00
    @missdeer 个人觉得, go 挺适合做一些小型或者中型的项目的,但说到大型甚至超大型的项目, go 还有很大的进步空间。
    weiweiwitch
        72
    weiweiwitch  
       2017-01-15 00:02:23 +08:00
    @bash99 同意你说的,从 C 或者 C++转 go 的,会更有亲切感。
    mingyun
        73
    mingyun  
       2017-01-15 00:04:47 +08:00
    @88250 nice
    spice630
        74
    spice630  
       2017-01-15 00:15:43 +08:00
    @codefalling
    麻烦你黑人的时候把争议链接带上,别搞的自己跟正义之师似的,恶心~~~
    cuebyte
        75
    cuebyte  
       2017-01-15 00:16:24 +08:00
    @missdeer 这种小 trick 有什么值得吹的?一个 gofmt 把代码风格限死也能被你们吹半天我真是服了,错误处理明明是反人类设计也能被你们视为“最佳实践”,估计你们也会觉得没有范型是个好特性吧。对软件工程一无所知?可能你们才是井底之蛙。
    ericbize
        76
    ericbize  
       2017-01-15 00:17:57 +08:00 via iPhone
    所以一个学过 c 渣渣 , java , python 的小萌新应该选择什么?
    cuebyte
        77
    cuebyte  
       2017-01-15 00:19:47 +08:00
    @sagaxu 我倒是把 kotlin 看成更友好、更简单的 scala 。未来应该会更好。
    HuangLibo
        78
    HuangLibo  
       2017-01-15 00:22:59 +08:00
    有些人把 Go 吹上天了, 这是病, 得治.
    spice630
        79
    spice630  
       2017-01-15 00:27:00 +08:00
    @cuebyte
    1.gofmt 并不是必选项
    2.gofmt 的确是很好的设定~~
    sheepbao
        80
    sheepbao  
       2017-01-15 01:06:47 +08:00
    你这不是疑惑啊,你是全盘否定啊,语言只是工具,你喜欢就用,不喜欢不用,没人强迫你
    比如:
    我喜欢 go ,我就用,我不喜欢 java ,我就不用
    neoblackcap
        81
    neoblackcap  
       2017-01-15 01:28:04 +08:00
    @linboki 所以说嘛,在使用用户态线程时就是得注意磁盘 IO ,要不然一次调度直接上万个用户态线程挂起。自己写的代码尚可这样,若是不是自己写的代码就得重写所有底层磁盘 IO 相关函数,否则一样大暴死,因为你不知道哪个库会在库里面来一下磁盘 IO 操作。
    nocturnal
        82
    nocturnal  
       2017-01-15 01:42:13 +08:00
    第二理解的相当有问题,协程不是异步回调,协程是状态的保存和切换,这种思想很容易写出异步代码,实现同样的异步功能, c++或者 java 之类的写到你想吐~
    Orzzzz
        83
    Orzzzz  
       2017-01-15 01:54:45 +08:00
    @weiweiwitch docker 算啥类型的项目 :P
    jarlyyn
        84
    jarlyyn  
       2017-01-15 02:57:36 +08:00   ❤️ 1
    最近看某热贴,瞎琢磨了下 go 语言。

    怎么感觉你们讨论的和我理解 go 语言不是一个东西……

    我理解里, go 语言不就是 shell 脚本的 plus 版 python 的高效易部署的 plus 版么……

    分明是被 python 的 2.x 和 3.x 搞了这么久搞了烦了,我直接打一个包爱几点几就几点几。

    你限制缩进这个能打出脑浆的东西,我连花括号换行不换行这个宗教问题都给你限制了。

    怎么会和 php 以及 node.js 打起来的。

    一定是我理解能力的问题。
    missdeer
        85
    missdeer  
       2017-01-15 09:23:28 +08:00 via Android
    @cuebyte 为什么每个公司甚至大公司里的每个项目组都会有一份自己的 coding style guideline ?这就说明 gofmt 存在的意义。有的人只顾自己心情想咋样咋样,说好听点是职业化程度不高,说难听点是自私自利,不顾全大局。多人合作开发的项目统一的编码风格能省掉多少麻烦,那不是让每个人自由发挥自己喜恶,彰显个性的地方。说你对软件工程一无所知已经是很留面子了。
    missdeer
        86
    missdeer  
       2017-01-15 09:34:27 +08:00 via Android
    @weiweiwitch 同意你说的,我原本的意思是 go 的一些设计解决了一些用其他语言做大型项目时遇到的痛点,但 go 目前说来做大型项目还是有点吃力,代码比较难组织,感觉这是所有脚本语言也常存在的问题。
    phrack
        87
    phrack  
       2017-01-15 10:02:04 +08:00 via Android
    无所谓,我主要就用 py 之类的脚本语言,大家伙用 go 的写好我直接调用就好了。
    MayLava
        88
    MayLava  
       2017-01-15 10:46:01 +08:00
    第一句话就已经看不下去了。

    “摩尔定律正在失效 第一个具有 3.0GHz 时钟速度的 Pentium 4 处理器是由英特尔于 2004 年推出的。 而今天,我的 Mackbook Pro 2016 的 CPU 时钟速度为 2.9GHz 。 可以看到在过去的十年中, CPU 处理能力没有太大的进步。 您可以在下面的图表中看到这一点。”

    不知道这图表谁做的。横轴年份等差,纵轴年份等比。我只看到了 CPU 性能依旧爆炸式的上升中。
    摩尔定律失效是没错,但是这并不代表性能就没有进步了。
    zongwan
        89
    zongwan  
       2017-01-15 12:37:12 +08:00
    go bigger or go home

    众所周知, swarm 是用 golang 打造的, k8s 也是用 golang 打造的
    两者因为某些利益在竞争
    战争背后散户也是有钱赚的

    会写个 Android 可能 google 并不会要,因为 google 的战略是开市场,所以自身也开发 APP 会互相竞争
    因为 google 也参与竞争, golang 学好了说不定就会有站 google 队伍的机会了

    golang 现在好不好用并不重要,诞生的原因注定了以后 google 之后的仗用的到
    ---
    当年的 dart , ng js 没有选择它, 因为 TypeScript 满足不了自己,所以准备开发 ngScript
    后来 TypeScript 选择站队
    不过再后来 dart 还是准备抱 ng js 大腿
    ng js 现在好不好也并不重要了
    但请记得 V8 好久没出来站队了

    PS: 我周围没什么 golang 的圈子所以没学起来
    等 golang 圈子扩大的阳光普照到吃瓜群众了,再开始学习也应该来得及吧。。。
    justmile
        90
    justmile  
       2017-01-15 13:12:25 +08:00
    本人菜鸟级 C 语言爱好者,不得不说用 GO 写并发确实省心, C 写起来真是一大坨,各种操碎了心!
    说说本人对 IO 多路复用和 goroutine 的理解:
    有家餐馆,只有一个伙计,客人来了先让客人入座,客人该干嘛干嘛,伙计每次忙完手上的事情的时候都会检查还有谁需要服务,如果是这边要倒茶,那边要上菜,没事,我们一个个来,反正大家有需求的时候都能得到比较好的服务。
    另一家餐馆,也同样只有一个伙计,客人来了也是先入座,但伙计会跟客人说:您看这么多人,我服务您的时间是有限的。比如客人坐下要点菜呀,点了一个菜另外一桌也要点菜了,伙计就说,不好意思啊,您先歇歇,我给另外一桌也点个菜,完了再过来为您服务
    上面第一个伙计就是 IO 多路复用,第二个就是 goroutine ,按我自己的理解, IO 多路复用的效率还是要高一些的,但 goroutine 有个优点就是可以很好地防止当前操作阻塞线程
    各有优点,何必要强说哪一个强哪一个弱呢?
    fourstring
        91
    fourstring  
       2017-01-15 13:36:41 +08:00
    我看了一下这篇文章,作者开头竟然仅仅用主频没有大变化证明摩尔定律失效,论证堪忧啊
    mengzhuo
        92
    mengzhuo  
       2017-01-15 14:01:02 +08:00
    范型…… go 自带的 interface+ auto generate 还不能满足你们的要求么?
    cuebyte
        93
    cuebyte  
       2017-01-15 14:13:11 +08:00
    @missdeer 本来还想为什么你能一本正经大放厥词,捧 gofmt 臭脚,还说不懂 gofmt 的人就不懂软件工程。没想到你拿 go 和脚本语言做比较了,可能是个高端黑,在下佩服。
    Weixk
        94
    Weixk  
       2017-01-15 14:54:26 +08:00
    说句实在话, Go 语言在 2016 年已经相当流行了。在我实习公司(国内软件产值最大)很多的部门使用编程语言都是 go + java 了。
    missdeer
        95
    missdeer  
       2017-01-15 15:09:05 +08:00
    @cuebyte 麻烦我没说过的话不要套到我的头上,往上翻翻我什么时候说了“不懂 gofmt 的人就不懂软件工程”,往大了说是栽赃诬陷。被有这样用心的人说一句“佩服”,我真心惶恐。
    zzn
        96
    zzn  
       2017-01-15 15:43:15 +08:00
    大体看了一下文章,作者基本没说啥呀,这种文章也能火起来?
    很多问题其实看这里好一点: https://golang.org/doc/faq

    goroutine 是协程,协程当然也是利用多线程+worker 队列来实现的,只是还处理了很多别的,比如系统调用不阻塞运行 goroutine 的物理线程等,协程比起单纯的多线程还是高级一点的,当然要是物理线程足够轻量那就没有用户态协程什么事了。

    说是 runtime 而不是虚拟机应该是因为 go 编译出来的是 native code ,不需要二次转换。

    gc 和性能也没啥大关系,写代码喜欢随意分配内存的人,即使没有 gc 也会有问题,而 gc 带来的好处尽量少的内存管理,而不是完全不管内存,写 gc 友好型代码也是一项很好的技能。任何特性都是有代价的, gc 带来的坏处是容易让人写出 gc 不友好代码,让很多程序员的锅就成了 gc 的锅。

    golang 其实有很多问题的,比如最让人蛋疼的是 string []byte 的转换是会拷贝的,编译器目前还没有能力分辨出是否需要拷贝。但作为一门新语言来说,其实还是很不错的,简洁的语法,够用的特性,默认静态编译,好用的 goroutine ,完善的库,开箱即用的测试/调试工具等。
    Balthild
        97
    Balthild  
       2017-01-15 19:35:03 +08:00
    @MayLava 这真不是在黑牙膏厂吗哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈
    HarveyDent
        98
    HarveyDent  
       2017-01-15 19:46:28 +08:00
    不太清楚 erlang 和 go 的区别,有达人来科普一下吗? go 和这个 20 多年前的东西本质区别在哪里。
    SoloCompany
        99
    SoloCompany  
       2017-01-15 20:11:57 +08:00 via iPhone
    [在 Java 中创建新线程会消耗大约 1MB 的内存堆大小]
    如果这文章不是翻译的差错百出,这么垃圾的文章喷也是浪费那个功夫
    jyf007
        100
    jyf007  
       2017-01-15 20:26:51 +08:00 via Android
    @ericbize 同上,一个只会写依赖 awk sed coreutils bash ,拼接 sql 的门外汉该怎么学习???
    1  2  
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2806 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 13:43 · PVG 21:43 · LAX 05:43 · JFK 08:43
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.