和map类似,channel也一个对应make创建的底层数据结构的应用
当我们赋值一个channel或用于函数参数传递时,我们只是拷贝了一个channel引用,因此调用者和被调用者尹艳红同一个channel对象,和其它的引用类型一样,channel的零值也是nil
定义一个channel时,也需要定义发送到channel的值的类型。channel可以使用内置的make()函数类创建
make(chan Type) //等价于make(chan Type,0)
make(chan Type,capacity)
//当capacity = 0时,channel是无缓冲阻塞读写的,当capacity>0时,channel有缓冲,是非阻塞的。直到写满capacity个元素才阻塞写入
channel通过操作符<-来接受和发送数据,发送和接收数据的语法
channel <- value //发送value 到channel
<-channel //接收并将其丢弃
x := <-channel //从channel中接收数据,并赋值给x
x.ok := <-channel //功能同上,同时检查通道是否已关闭或者为空
解决上一篇文章,多任务竞争资源的问题
package main
import (
"fmt"
"time"
)
//全局变量,创建一个channel
var ch = make(chan int)
//定义一个打印机,参数为字符串,按每个字符打印
//打印机属于公共资源
func Printer(str string){
for _,data := range str{
fmt.Printf("%c",data)
time.Sleep(time.Second)
}
fmt.Printf("\n")
}
//person1执行完后,才能到person2执行
func person1(){
Printer("hello")
ch <- 666 //给管道写数据,发送
}
func person2(){
<-ch //从管道取数据,如果通道么有数据,会阻塞
Printer("world")
}
func main(){
//新建2个协程,代表2个人,2个人同时使用打印机
go person1()
go person2()
//特地不让主协程结束,死循环
for {
}
}
#结果
hello
world

网友评论