最近自学Go语言,看到go并发和channel通信了,还没深入channel通信,就先写个简单例子了解一下,代码如下:
package main
import "fmt"
func Add(index int, ch chan int) {
fmt.Println(index, ":Before Counting")
ch <- 1
fmt.Println(index, ":After Counting")
}
func main() {
chs := make([]chan int, 10)
for i := 0; i < 10; i++ {
chs[i] = make(chan int)
go Add(i, chs[i])
}
for i, ch := range chs {
fmt.Println("第", i, "个ch输出", <-ch)
}
}
运行结果如下:
0 :Before Counting
0 :After Counting
1 :Before Counting
2 :Before Counting
3 :Before Counting
4 :Before Counting
5 :Before Counting
6 :Before Counting
7 :Before Counting
8 :Before Counting
9 :Before Counting
第 0 个ch输出 1
第 1 个ch输出 1
第 2 个ch输出 1
第 3 个ch输出 1
第 4 个ch输出 1
第 5 个ch输出 1
第 6 个ch输出 1
第 7 个ch输出 1
第 8 个ch输出 1
第 9 个ch输出 1
请问:为什么第一个goroutine的before和after都输出了?为什么后面的都只输出了before,而且没有after的输出?
有疑问加站长微信联系(非本文作者)

协程还没输出 after 的时候主程序就退出了,在代码末尾加上 time.Sleep(5 * time.Second) 就可以看到了,不过正确的方法还是加上同步,参考 http://golang.org/pkg/sync/#WaitGroup
您好,能结合上面的例子给具体修改一下吗?还有,为什么第一个goroutine的after输出了?不是应该阻塞的吗?
把 chs[i] = make(chan int),改成 chs[i] = make(chan int,1) 再看看结果
这样就变成顺序before、after的依次输出了,能否对这整个的流程做个详细的说明啊?并不是很理解这里为什么会这样输出
http://golang.org/ref/mem#tmp_7
英文不太好,跪求简单的叙述一下
发现了个中文版 http://www.hellogcc.org/effective_go.html#channels 其实就是 不带缓冲区和带缓冲区channel之间的区别
你的结果是正常的,没有异常:
本站就有中文版文档: http://docscn.studygolang.com/doc/effective_go.html#信道
谢谢你
谢谢你的回答,可能这里我还得再理解一下,多看看书了,不过还是非常感谢你
嗯,知道了,谢谢你的帮助
不带缓冲区的channel: ch <- 1时,只有ch里面的值被另外的goroutine接收后,才能执行ch<-1 的下一行代码;带缓冲区的channle: ch<-1时,若ch未满,则继续执行下去。。。否则阻塞住
嗯,这个解释太通俗易懂了,呵呵,谢谢