异步编程经常有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 1
不要企图用一门语言让自己牛逼。
|
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++ 的更快了。
|