1.通道是什么
通道,在golang中的形式为类型为chan,是golang中同步的两个机制之一(另一个是WaitGroup)。
chan的语法形式如下:
ChannelType = ( "chan" | "chan" "<-" | "<-" "chan" ) ElementType .
chan的类型可以是chan、chan<-、<-chan任意一种+数据类型(如int或者自定义类型)
2.通道的用法
1)创建chan
创建chan的方法如下:
c := make(chan int, 1)
make后面为缓冲数目,如果不加缓冲,则为无缓冲。
可以创建只有读或者写的chan,但这样的通道没有什么用,故在实践中不常存在。
2)读写chan
读写chan的符号为<-。读chan形式为 <-ch, 写chan形式为 ch<-。
缓冲数意味着读取或写入数目够了的话,将无法进行读取或写入。
没有缓冲的chan将会阻塞读或者写,直到有读或者写。
3)关闭chan
关闭chan的方法为close()。chan被关闭以后,并不马上消除空间(因为golang语言的)
4)无缓冲的chan与有缓冲的chan
就像上面的所说的,如果不加缓冲数目,则为无缓冲的chan;否则会生成一定缓冲数目。
没有缓冲的chan将会阻塞读或者写,直到有读或者写。
缓冲数目够了以后,chan也将不会读和写。
5)chan与select
chan可以与select一起用,用于并发控制。
select和chan的用法如下:
1)select会遍历所有case;
2)所有的case都会被求值或计算,求值或计算顺序:从左到右,从上到下;
3)如果chan没有阻塞,则随机执行一个case;
4)如果chan被阻塞,则直到一个chan不被阻塞才会执行。