channel

Go语言在语言级别提供的goroutine间的通信方式

声明方式

var chanName chan ElementType

利用make 定义 可以指定chan 的容量。

channel的写与读

协程之间的通信通过channel进行,也可以进行协程之间的同步。

channel的写与读

package main 
 
import (
    "fmt"
    "time"
    "strconv"
)
    
func Add(x, y int) {     
    z := x + y    
    fmt.Println(z) 
}    

func Read(ch chan int){       //没有写入会阻塞
    value := <- ch         //从value读出一个数据

    fmt.Println("value:" + strconv.Itoa(value)) //(string)value  
    //上面该函数将输入int型转换成str型
}

func Write(ch chan int){
    ch <- 10                 //写入10
}

func main() {  
    ch := make(chan int)

    go Read(ch)     //先读,阻塞
    go Write(ch)    //写入之后,再进行读出
                    //写入之后没有读出操作也会阻塞
    time.Sleep(10)          //为了让协程都执行完
    fmt.Println("end of code")
}

输出:

value:10
end of code

等十个协程都完成之后再结束

channel不用time

package main 
 
import (
    "fmt"
    "strconv"
)
    
func Add(x, y int, quit chan int) {     
    z := x + y    
    fmt.Println(z) 
    
    quit <- 1                //每个协程开完之后,往里写一
}    

func Read(ch chan int){       //没有写入会阻塞
    value := <- ch         //从value读出一个数据

    fmt.Println("value:" + strconv.Itoa(value)) //(string)value  
    //上面该函数将输入int型转换成str型
}

func Write(ch chan int){
    //ch <- 10                 //写入10
}

func main (){
    chs := make([]chan int , 10)       //声明一个chan int 类型,10个
    for i := 0 ; i < 10 ; i ++{        //遍历开协程
        chs[i] = make(chan int)        //对每一个元素进行实例化,真实的生成channel
        go Add(i , i , chs[i])         //每一个协程执行完毕后,往里写一
    }
                           
    for _, v := range chs{        //遍历channel数组
        <-v                       //输出channel的值
    }
}

输出:

> Output:
command-line-arguments
18
4
6
8
10
12
14
0
16
2
> Elapsed: 5.185s
> Result: Success