1、channel通道是阻塞的,一个协程给通道发送数据,则必须有另一个协程接收数据,否则报错
可以建立很过个通道,指定哪个协程通过哪个通道读取数据
package main import "fmt" import "time" func main(){ var chanels [10]chan int for i := 0; i < 10; i++ { chanels[i] = make(chan int) go doWork(i,chanels[i]) } for i := 0; i < 10; i++ { chanels[i]<-'a'+i } time.Sleep(1000*time.Millisecond) } func doWork(i int,c chan int){ for{ fmt.Printf("the work %d,received %d ",i,<-c) } }
2、可以返回一个channel,看下面这个修改
package main import "fmt" import "time" func main(){ var chanels [10]chan int for i := 0; i < 10; i++ { chanels[i] = createWork(i) // go doWork(i,chanels[i]) } for i := 0; i < 10; i++ { chanels[i]<-'a'+i } time.Sleep(1000*time.Millisecond) } func createWork(i int) chan int{ c := make(chan int) go func(){ for{ fmt.Printf("the work %d,received %d ",i,<-c) } }() return c }
下面这个例子的执行结果
package main import ( "fmt" "time" ) func say(s string) { for i := 0; i < 5; i++ { time.Sleep(100 * time.Millisecond) fmt.Println(s) } } func main() { go say("world") say("hello") }
结果如下
hello world world hello hello world world hello world hello
发现hello会输出很多次