是认真学异步编程好,还是投身 golang? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
alexapollo
V2EX    程序员

是认真学异步编程好,还是投身 golang?

  •  
  •   alexapollo
    geekan 2014-12-26 22:19:19 +08:00 6554 次点击
    这是一个创建于 3965 天前的主题,其中的信息可能已经有所发展或是发生改变。

    异步编程经常有callback地狱,虽然可以用promise解决一些,但仍然会写的很痛苦,开发效率低极了
    golang的用户态线程直接就让人用同步写异步逻辑啊

    40 条回复    2014-12-29 21:51:16 +08:00
    ETiV
        1
    ETiV  
       2014-12-26 22:25:00 +08:00 via iPhone
    做web的,js不会行么…

    俩都学呗,技多不压身
    est
        2
    est  
       2014-12-26 22:28:58 +08:00
    golang吧。
    alexapollo
        3
    alexapollo  
    OP
       2014-12-26 22:31:16 +08:00
    @ETiV c++的=_=
    aszxqw
        4
    aszxqw  
       2014-12-26 22:31:25 +08:00
    golang
    datou552211
        5
    datou552211  
       2014-12-26 22:31:58 +08:00
    js + golang
    ffffwh
        6
    ffffwh  
       2014-12-26 23:46:27 +08:00
    js:人力CPS(Continuation Passing Style)变换
    go:CSP(Communicating Sequential Processes)、actor model
    zjdboy
        7
    zjdboy  
       2014-12-26 23:57:59 +08:00
    golang
    Akagi201
        8
    Akagi201  
       2014-12-27 11:37:59 +08:00 via iPhone
    libuv
    semicircle21
        9
    semicircle21  
       2014-12-27 11:46:33 +08:00
    @alexapollo 你是从 c++ 世界来的, 如果我提醒你 golang 没有模板/泛型, 没有继承, 根本就不是面向对象的, 只是 c 语言的增强版, 你还会爱 golang 吗?
    Comdex
        10
    Comdex  
       2014-12-27 12:26:31 +08:00
    golang简单高效,妥妥的,不要用惯性思维看待一门新语言。
    alexapollo
        11
    alexapollo  
    OP
       2014-12-27 13:46:37 +08:00
    @semicircle21 我以前是写C的,现在写C++写得想吐
    golang大法好!

    有宏吗?
    alexapollo
        12
    alexapollo  
    OP
       2014-12-27 13:47:52 +08:00
    @ffffwh 好专业,有通俗易懂的版本没……
    semicircle21
        13
    semicircle21  
       2014-12-27 15:23:36 +08:00
    @alexapollo 没有宏, 这个恐怕不算是个缺陷,
    如果你用不惯 c++, 那你确实适合 golang , 而且我个人觉得 interface 的设计很不错 ...(略去展开的65535字)
    alexapollo
        14
    alexapollo  
    OP
       2014-12-27 19:37:34 +08:00
    @semicircle21 你确定吗……没有宏很多东西不好写
    它最大的优点是什么?
    pertersonvv
        15
    pertersonvv  
       2014-12-27 20:47:05 +08:00
    @ETiV 在加一个Ruby,学仨个吧:)
    ffffwh
        16
    ffffwh  
       2014-12-27 22:08:17 +08:00
    @alexapollo
    据说是“背后的原理”,我也是一知半解,深入了解的计划还在todo list里。
    js回调函数,可以看成是continuation(延续,当前执行点然后要做的事情)。传一个回调函数,又叫continuation passing style。
    有些语言,支持first-class continuation,可以自动把当前点的continuation捕获,放到一个变量里去,这个变量就像闭包函数一样可以随便传。由此可以达成“以同步的方式书写异步的代码”。
    像这个教程最后的部分 http://docs.racket-lang.org/more/index.html。
    这方面我给自己留的书单是 EOPL。
    noli
        17
    noli  
       2014-12-27 23:43:46 +08:00 via iPhone
    c++不想异步回调不是还有boost::coroutine吗?
    alexapollo
        18
    alexapollo  
    OP
       2014-12-28 02:37:37 +08:00
    @noli 还不是特别会协程,但好像性能一般会比纯异步差一些
    pertersonvv
        19
    pertersonvv  
       2014-12-28 20:46:54 +08:00
    楼主开始搞Go了么?
    yangxin0
        20
    yangxin0  
       2014-12-28 22:02:17 +08:00   1
    不要企图用一门语言让自己牛逼。
    mengzhuo
        21
    mengzhuo  
       2014-12-28 23:07:02 +08:00
    20楼说的在理

    libev go 在Linux都用了Epoll
    理解Epoll之后,这些都不是事,接下来是团队合作速度和产品生命周期的取舍问题了
    td width="10" valign="top">
    semicircle21
        22
    semicircle21  
       2014-12-29 10:41:22 +08:00
    @alexapollo 基本是我自己的主观感受:
    宏太灵活了, 存在被滥用的可能, 而且有时, 由宏导致的错误很难很难发现. 如果在 c 里有选择的话, 我更希望用其他语言特性替代宏.

    interface: 以前在C语言里常用 "一组的函数指针用结构体封装" 的模式当做接口, 或者说是类似 OO 里"模板方法", 这是我很喜欢的模式, 现在 golang 明白无误的管这种设计叫 interface, (当然, 这个interface 这种设计问题属于口味问题, golang 了不起的地方还是协程balabala)
    semicircle21
        23
    semicircle21  
       2014-12-29 10:42:35 +08:00
    @alexapollo 还有, golang 的闭包实际是个坑, 一定要小心谨慎的使用.
    njutree
        24
    njutree  
       2014-12-29 11:27:41 +08:00
    看到楼主问这个问题说明楼主对golang的同步编程模型还是有一定认识的,许大大说同步编程降低了我们的心智负担我觉得真的是这样。至于异步编程,在有些场景下是无法割舍的,不存在说投身golang就不学异步的思想了。
    alexapollo
        25
    alexapollo  
    OP
       2014-12-29 11:35:58 +08:00
    @semicircle21 为啥说闭包是坑啊?我一直觉得是个挺好用的特性
    semicircle21
        26
    semicircle21  
       2014-12-29 11:47:08 +08:00
    @alexapollo golang 的闭包是有坑的, 真的是.
    简单的说: golang capture 进来的变量是引用, 而不是拷贝的.
    这个概念我老是模糊, 现在也不是100%sure, 所以我又写了遍, 你看下:
    http://play.golang.org/p/_P0YELOj6N
    semicircle21
        27
    semicircle21  
       2014-12-29 11:55:56 +08:00
    semicircle21
        28
    semicircle21  
       2014-12-29 11:57:25 +08:00
    @alexapollo 日, 刚才那版错的, 看这里:
    http://play.golang.org/p/TgRDfV13hm
    xuyuanp
        29
    xuyuanp  
       2014-12-29 13:40:44 +08:00
    @semicircle21 这个有哪里不对吗?
    alexapollo
        30
    alexapollo  
    OP
       2014-12-29 14:17:03 +08:00
    @semicircle21 不是很理解为什么captured 10
    semicircle21
        31
    semicircle21  
       2014-12-29 14:35:34 +08:00
    @alexapollo
    @xuyuanp
    golang 闭包 "包"进来的 是 i 这个变量的"引用", 也就是说, 在 for 循环结束后, i = 10 了, 然后 go func() {} 那些才开始执行, 然后你就看到 captured 都是10了.
    其他语言里不是这样的, 是传值的, 或者是拷贝的. (至少对于 int 这样的基本类型不是)
    xuyuanp
        32
    xuyuanp  
       2014-12-29 15:32:42 +08:00
    @semicircle21 好吧。。。
    但是我觉得引用反而比较好,想拷贝的话,传参数就行
    如果本来就是拷贝,那想实现引用的效果反而会比较难
    alexapollo
        33
    alexapollo  
    OP
       2014-12-29 15:46:53 +08:00
    @semicircle21 那下面的传值函数是保留了十个上下文,在主函数结束循环后才开始启动吗?
    semicircle21
        34
    semicircle21  
       2014-12-29 16:14:52 +08:00
    @alexapollo
    可以理解为在循环结束后才开始的, golang 在调用函数传参时, 对 int 类型, 是拷贝的.
    semicircle21
        35
    semicircle21  
       2014-12-29 16:39:19 +08:00
    @xuyuanp http://play.golang.org/p/gAeiyN8mKe
    我新增了第三种, 只是新赋值了一个 c, 然后整个行为又不同了,
    也就是说 capture 的行为和 赋值 = 不一样, 与其他语言不同不是问题, 但这个真有点有悖惯性思维.
    我想不通为什么会这么设计.

    另外, 如果默认拷贝, 想实现引用的时候, &取地址就行了, golang 是有指针类型的.
    xuyuanp
        36
    xuyuanp  
       2014-12-29 17:06:48 +08:00
    @semicircle21
    可能是我对其他语言的闭包了解的不多
    学了go之后,一下子就接受了这个设定,毫无违和感。。。

    取地址这个我确实没想到。。。
    janxin
        37
    janxin  
       2014-12-29 18:37:55 +08:00
    @semicircle21 应该还是和golang的约定有关的,有点类似的还有slice的问题
    alexapollo
        38
    alexapollo  
    OP
       2014-12-29 18:50:08 +08:00
    @semicircle21 c此时相当于是拷贝,因为你var在这个临界区里,如果你var在外面,就还是引用的~
    alexapollo
        39
    alexapollo  
    OP
       2014-12-29 18:51:02 +08:00
    @semicircle21 看起来都是闭包的特性
    noli
        40
    noli  
       2014-12-29 21:51:16 +08:00
    @alexapollo 连 c++ coroutine 切换的性能损失都不能忍受,那你还用个毛线的 golang 啊?不会比 C++ 的更快了。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     6071 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 02:10 PVG 10:10 LAX 18:10 JFK 21:10
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86