
异步编程经常有callback地狱,虽然可以用promise解决一些,但仍然会写的很痛苦,开发效率低极了
golang的用户态线程直接就让人用同步写异步逻辑啊
1 ETiV 2014-12-26 22:25:00 +08:00 via iPhone 做web的,js不会行么… 俩都学呗,技多不压身 |
2 est 2014-12-26 22:28:58 +08:00 golang吧。 |
3 alexapollo OP @ETiV c++的=_= |
4 aszxqw 2014-12-26 22:31:25 +08:00 golang |
5 datou552211 2014-12-26 22:31:58 +08:00 js + golang |
6 ffffwh 2014-12-26 23:46:27 +08:00 js:人力CPS(Continuation Passing Style)变换 go:CSP(Communicating Sequential Processes)、actor model |
7 zjdboy 2014-12-26 23:57:59 +08:00 golang |
8 Akagi201 2014-12-27 11:37:59 +08:00 via iPhone libuv |
9 semicircle21 2014-12-27 11:46:33 +08:00 @alexapollo 你是从 c++ 世界来的, 如果我提醒你 golang 没有模板/泛型, 没有继承, 根本就不是面向对象的, 只是 c 语言的增强版, 你还会爱 golang 吗? |
10 Comdex 2014-12-27 12:26:31 +08:00 golang简单高效,妥妥的,不要用惯性思维看待一门新语言。 |
11 alexapollo OP |
12 alexapollo OP @ffffwh 好专业,有通俗易懂的版本没…… |
13 semicircle21 2014-12-27 15:23:36 +08:00 @alexapollo 没有宏, 这个恐怕不算是个缺陷, 如果你用不惯 c++, 那你确实适合 golang , 而且我个人觉得 interface 的设计很不错 ...(略去展开的65535字) |
14 alexapollo OP @semicircle21 你确定吗……没有宏很多东西不好写 它最大的优点是什么? |
15 pertersonvv 2014-12-27 20:47:05 +08:00 @ETiV 在加一个Ruby,学仨个吧:) |
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。 |
17 noli 2014-12-27 23:43:46 +08:00 via iPhone c++不想异步回调不是还有boost::coroutine吗? |
18 alexapollo OP @noli 还不是特别会协程,但好像性能一般会比纯异步差一些 |
19 pertersonvv 2014-12-28 20:46:54 +08:00 楼主开始搞Go了么? |
20 yangxin0 2014-12-28 22:02:17 +08:00 不要企图用一门语言让自己牛逼。 |
21 mengzhuo 2014-12-28 23:07:02 +08:00 20楼说的在理 libev go 在Linux都用了Epoll 理解Epoll之后,这些都不是事,接下来是团队合作速度和产品生命周期的取舍问题了 |
22 semicircle21 2014-12-29 10:41:22 +08:00 @alexapollo 基本是我自己的主观感受: 宏太灵活了, 存在被滥用的可能, 而且有时, 由宏导致的错误很难很难发现. 如果在 c 里有选择的话, 我更希望用其他语言特性替代宏. interface: 以前在C语言里常用 "一组的函数指针用结构体封装" 的模式当做接口, 或者说是类似 OO 里"模板方法", 这是我很喜欢的模式, 现在 golang 明白无误的管这种设计叫 interface, (当然, 这个interface 这种设计问题属于口味问题, golang 了不起的地方还是协程balabala) |
23 semicircle21 2014-12-29 10:42:35 +08:00 @alexapollo 还有, golang 的闭包实际是个坑, 一定要小心谨慎的使用. |
24 njutree 2014-12-29 11:27:41 +08:00 看到楼主问这个问题说明楼主对golang的同步编程模型还是有一定认识的,许大大说同步编程降低了我们的心智负担我觉得真的是这样。至于异步编程,在有些场景下是无法割舍的,不存在说投身golang就不学异步的思想了。 |
25 alexapollo OP @semicircle21 为啥说闭包是坑啊?我一直觉得是个挺好用的特性 |
26 semicircle21 2014-12-29 11:47:08 +08:00 @alexapollo golang 的闭包是有坑的, 真的是. 简单的说: golang capture 进来的变量是引用, 而不是拷贝的. 这个概念我老是模糊, 现在也不是100%sure, 所以我又写了遍, 你看下: http://play.golang.org/p/_P0YELOj6N |
27 semicircle21 2014-12-29 11:55:56 +08:00 |
28 semicircle21 2014-12-29 11:57:25 +08:00 |
29 xuyuanp 2014-12-29 13:40:44 +08:00 @semicircle21 这个有哪里不对吗? |
30 alexapollo OP @semicircle21 不是很理解为什么captured 10 |
31 semicircle21 2014-12-29 14:35:34 +08:00 @alexapollo @xuyuanp golang 闭包 "包"进来的 是 i 这个变量的"引用", 也就是说, 在 for 循环结束后, i = 10 了, 然后 go func() {} 那些才开始执行, 然后你就看到 captured 都是10了. 其他语言里不是这样的, 是传值的, 或者是拷贝的. (至少对于 int 这样的基本类型不是) |
32 xuyuanp 2014-12-29 15:32:42 +08:00 |
33 alexapollo OP @semicircle21 那下面的传值函数是保留了十个上下文,在主函数结束循环后才开始启动吗? |
34 semicircle21 2014-12-29 16:14:52 +08:00 @alexapollo 可以理解为在循环结束后才开始的, golang 在调用函数传参时, 对 int 类型, 是拷贝的. |
35 semicircle21 2014-12-29 16:39:19 +08:00 @xuyuanp http://play.golang.org/p/gAeiyN8mKe 我新增了第三种, 只是新赋值了一个 c, 然后整个行为又不同了, 也就是说 capture 的行为和 赋值 = 不一样, 与其他语言不同不是问题, 但这个真有点有悖惯性思维. 我想不通为什么会这么设计. 另外, 如果默认拷贝, 想实现引用的时候, &取地址就行了, golang 是有指针类型的. |
36 xuyuanp 2014-12-29 17:06:48 +08:00 |
37 janxin 2014-12-29 18:37:55 +08:00 @semicircle21 应该还是和golang的约定有关的,有点类似的还有slice的问题 |
38 alexapollo OP @semicircle21 c此时相当于是拷贝,因为你var在这个临界区里,如果你var在外面,就还是引用的~ |
39 alexapollo OP @semicircle21 看起来都是闭包的特性 |
40 noli 2014-12-29 21:51:16 +08:00 @alexapollo 连 c++ coroutine 切换的性能损失都不能忍受,那你还用个毛线的 golang 啊?不会比 C++ 的更快了。 |