channel

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会输出很多次