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 //表示通道的方向,这个表示该通道只能输出(对于使用者来说就是读取)

浙公网安备 33010602011771号