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

2014-12-26 22:19:19 +08:00
 alexapollo

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

6027 次点击
所在节点    程序员
40 条回复
mengzhuo
2014-12-28 23:07:02 +08:00
20楼说的在理

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

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

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

取地址这个我确实没想到。。。
janxin
2014-12-29 18:37:55 +08:00
@semicircle21 应该还是和golang的约定有关的,有点类似的还有slice的问题
alexapollo
2014-12-29 18:50:08 +08:00
@semicircle21 c此时相当于是拷贝,因为你var在这个临界区里,如果你var在外面,就还是引用的~
alexapollo
2014-12-29 18:51:02 +08:00
@semicircle21 看起来都是闭包的特性
noli
2014-12-29 21:51:16 +08:00
@alexapollo 连 c++ coroutine 切换的性能损失都不能忍受,那你还用个毛线的 golang 啊?不会比 C++ 的更快了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/157002

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX