声明
var messageChan chan string //信道声明(仅声明无法使用,值为nil,需初始化)
messageCHan := make(chan string) //声明并初始化
信道的数据发送和读取
messageChan := make(chan string, 10)
message <-"小马" //发送数据
data := <-messageChan //读取数据
close(messageChan) //关闭信道
关闭状态的信道无法发送数据
判断信道状态
_, ok := ,-messageChan
if !0k {
fmt.Println("信道已关闭")
return
}
信道容量
messageChan := make(chan string, 10) //容量为10,多个协程可共享这些数据
不填写容量参数时,容量为0,不能缓存数据(无缓冲数据,无法发送、接收数据,除非立马将数据接收,接收端必须先于发送端准备好)。
容量为1时,只能存放1个数据,再发送会堵塞,利用这个特点可以做程序锁。
对信道进行range遍历
遍历前要关闭信道
pipline := make(chan int, 10)
//发送数据
n := cap(pipline)
x, y := 1, 1
for i :=0; i < n; i++ {
pipline <- x
x, y = y, x+y
}
close(pipline) //for-range遍历前要关闭信道
// 遍历数据
for data := range pipline {
fmt.Print(data)
fmt.Print("")
}
双向信道和单向信道
双向信道:能读能写
单向信道:只读、只写
type Receive = <-chan int //只读信道
type Sender = chan <-int //只写信道
func main() {
pipline := make(chan int)
go func() {
var sender Sender = pipline
fmt.Println("发送数据:77")
sender <- 77
}()
go func() {
var receiver Receiver = pipline
data := <-receiver
fmt.Println("接收数据:%d\n", data)
}()
time.Sleep(time.Second)
}