Golang 的异步编程模型比 Node 有意思
 发布于 12 年前  作者 jiyinyiyong  20934 次预览  最后一次回复是 12 年前  来自  

Node 里异步编程, 只能靠 callback 或者 promise 来完成, 但是 Golang 看起来有意思多了…

package main
import "fmt"
 
func foo(){
    defer fmt.Println("World")
    fmt.Println("Hello")
}
 
func sum(x,y int,c chan int){
    c <- x + y
}
 
func main(){
    foo()
    c := make (chan int);
    go sum(24,18,c)
    fmt.Println(<-c);
}

通过 Channel 的概念, fmt.Println(<-c) 会阻塞代码执行, 而 go sum(24,18,c) 启动的 goroutine 则继续执行, 等到 c <- x + y 往 Channel 里发送了数据, fmt.Println(<-c) 接收到了数据, 才继续执行代码, 这样就比较方便能用同步的逻辑写异步代码, Node 也方便, 但是不够优雅 …难怪那么多人用惯了后端语言以后不喜欢 Node

感受下 Golang 的中文社区 http://www.golangtc.com/ studygolang.com/ https://groups.google.com/d/forum/golang-china

26 回复
xieren58

玩过go,但是还是喜欢node~

lb1104

golang太精确,不用的不注释掉,好像不能运行.加上还要给变量定义类型,特别是req跟res,要输好长一串.研究了段时间就没有继续了,不过go sum(24,18,c),这个异步确实不错

hhuai

有意思么,还是喜欢node.

jiyinyiyong

嗯, 静态类型, 编译代码结果就是汇编在跑, 精确还是好事, 不是琐碎就好了

dengqiao

golang已经成了我做项目的首选,当然node.js也很是喜欢,做游戏的话node.js是首选

hexie

静态编译很多语法错误能够在编译的时候避免了。

halfblood

一个是静态语言,一个是动态语言,差别太大了……

fengmk2

很难说那个好,例如底层的libuv,它也不是协程的方式,代码也不写起来很舒服?

就让时间去证明吧。

我们不要纠结在起点,喜欢用什么的就用什么,just code it

jiyinyiyong

Node 玩来玩去就这么点东西, 除了方便一点…

fengmk2

@jiyinyiyong 那种语言的本质不是一样的?

jiyinyiyong

@suqian 如果因为本质一样就不需要不同语言, 就不会有那么多语言出现了. 话说本质这东西学了三四年还是摸不到啊 T_T 还不是为了更好玩. 可 Node 受 JS 语法限制, 没有多少有趣的特性, JS 程序员, 相当多就死死卡着 JS, 不如新语言学着开心… 虽然做事情未必,

liuyanghejerry

Go挺好,就是语法太另类了。。

jiyinyiyong

相信我, JS 的语法绝对比 Go 欠缺考虑. 另类本身和褒贬没有关联.

fengmk2

@jiyinyiyong 新语言年年有,选择一个自己最喜欢的,深入够再考虑新欢。

jiyinyiyong

@suqian 嗯, 最后还是要实战来指导的. 不过目前写前端的话, 后端我先学到哪是哪了

nobuta

看不懂…go是用了协程吗???

livejs

golang有比较好的mvc框架吗

jiyinyiyong

类似 coroutine 但不叫 coroutine, 网上的说法是个叫 CSP 的并发模型.

jiyinyiyong

网上有但还没了解过, 后端 MVC 相对来说还是不少的

dengqiao

多的很,beego,revel跟express差不多的

livejs

@dengqiao大神你好啊,revel是哪国的框架啊,这个没有说明文档教程的吧

JacksonTian

ES6里会出来generator的,不用羡慕。

jiyinyiyong

ES6 依然单线程哦, Golang 的并发模型能用在并行计算的