go routine之间可以通过channel来通信。
**1、单向channel&双向channel**
<-chan只能用来发送的单向channel;chan<-只能用来接收的单向channel;chan双向channel
向<-chan发送数据 或者 接收chan<-的数据;编译失败
```
var cc = make(<-chan int)
close(cc)
cc <- 23
# command-line-arguments
.\main.go:48:7: invalid operation: close(cc) (cannot close receive-only channel)
.\main.go:49:5: invalid operation: cc <- 23 (send to receive-only type <-chan int)
```
```
var cc = make(chan<- int)
v:= <-cc
# command-line-arguments
.\main.go:49:6: invalid operation: <-cc (receive from send-only type chan<- int)
```
单向channel的应用场景是什么呢,回头研究一下。
**2、channel的声明**
声明一个传输整形的buffer chan,容量为6:
```
var cc = make(chan int, 6)
```
****读缓存中为空的channel和写入缓存已满的channel都是阻塞的****
****因此,声明channel必须指定容量,channel才"可用",否则channel的读写是阻塞的****
**3、channel使用完毕,使用close(c chan<- Type)关闭channel**
向关闭的channel发送数据,会导致panic
```
***
var cc = make(chan int,1)
close(cc)
cc <- 23
***
panic: send on closed channel
```
**4、channel使用方法**
```
cc:=make(chan int,6)
go func() {
for i:=0;i<1000;i++{
cc <-i
}
}()
loop:for {
select {
case int1:= <- cc:
fmt.Println(int1)
case <-time.After(5 * time.Second):
fmt.Println("timeout")
break loop
}
}
close(cc)
```
有疑问加站长微信联系(非本文作者))