• 请不要在回答技术问题时复制粘贴 AI 生成的内容
alexapollo
V2EX  ›  程序员

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

  •  
  •   alexapollo ·
    geekan · Dec 26, 2014 · 7237 views
    This topic created in 4336 days ago, the information mentioned may be changed or developed.

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

    40 replies  •  2014-12-29 21:51:16 +08:00
    ETiV
    ETiV
    Dec 26, 2014 via iPhone
    1
    做web的,js不会行么…

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

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

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

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

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

    取地址这个我确实没想到。。。
    janxin
    janxin
    Dec 29, 2014
    37
    @semicircle21 应该还是和golang的约定有关的,有点类似的还有slice的问题
    alexapollo
    alexapollo
    OP
    Dec 29, 2014
    38
    @semicircle21 c此时相当于是拷贝,因为你var在这个临界区里,如果你var在外面,就还是引用的~
    alexapollo
    alexapollo
    OP
    Dec 29, 2014
    39
    @semicircle21 看起来都是闭包的特性
    noli
    noli
    Dec 29, 2014
    40
    @alexapollo 连 c++ coroutine 切换的性能损失都不能忍受,那你还用个毛线的 golang 啊?不会比 C++ 的更快了。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   896 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 54ms · UTC 21:05 · PVG 05:05 · LAX 13:05 · JFK 16:05
    ♥ Do have faith in what you're doing.