go中的协程为goruntine,那么各个goruntine之间采用channel传递数据来进行切换,channel为收发阻塞,当一个发送数据的channel发送之后,该goruntine阻塞,直到有对应的gorutine去接收该数据。main方法也是一个gorutine
为了证明这点,我们用towchan方法 开启一个协程用于接收消息,并返回towchan(一个包含channel的 结构体),在主协程(main方法的协程)对towchan中的chaneel发送信息。当在main协程中对channel发送数据,而另外一个协程中的channel的没有接收到数据时,此时main channel继续向下进行,在执行完下面的代码之后,main gorutine有可能直接运行结束,所以需要sleep显示的阻塞main协程
package main
import (
"fmt"
"time"
)
func getChanInt()twochan{
ints := make(chan int)
go func() {
for n:=range ints{
fmt.Printf("getInfo:%d\n",n)
}
}()
return twochan{chanint: ints}
}
type twochan struct {
chanint chan int
}
func sendInfo(){
var values [10]twochan
for i:=0;i<1;i++{
values[i] = getChanInt()
}
for i:=0;i<100;i++{
values[0].chanint<-'a'+i
}
time.S