go语言学习笔记:channel

线程间通信通常采用共享内存与消息的方式。 go语言本身就是为了解决并发而生,如果还是使用共享内存加锁那一套就没什么新意了,实在太复杂。

go语言采用channel机制来解决协程间通信问题,其实就是一种消息通信方式。

消息通信方式好处是独立。像进程间通信一样独立。

需要指出的是chan是关键字

package main

import(
    "fmt"
    "time"
)

func send(re chan int){
    re <- 100
    fmt.Println("rend val 100")
}

func recv(re chan int){
    val :=<- re
    fmt.Println("recv ", val)
}

func main(){
    //var ch chan int         //这样的方式只是声明了一个nil的通道,所以总是出错
    //ch := make(chan, int)   //注意中间没有“,”
    //ch := make(chan int, 1) //这个是有一个缓冲区的通道,即使没有读操作,第一次写的时候也不会阻塞。对于带缓存的通道,如果没人写入内容,那么读的协程一样会被阻塞住。
    ch := make(chan int)      //这是个无缓冲区的通道,这意味着如果没有人读,那么它会一直阻塞
    go recv(ch)
    go send(ch)
    time.Sleep(1000000000)
}

done := make(chan struct{})
done <- struct{}{} // 这种方式的用法是发送一个空的消息,有时候我们并不需要关注值,只是需要一个消息,比如done

 

out chan<- int     //表示通道的方向,这个表示该通道只能写入,它是编译时候检查的
in <-chan int      //表示通道的方向,这个表示该通道只能输出(对于使用者来说就是读取)

 

 

 

posted @ 2017-12-01 16:10  你的KPI完成了吗  阅读(281)  评论(0)    收藏  举报