channel类型

2020-08-10  本文已影响0人  测试探索

和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
image.png
上一篇 下一篇

猜你喜欢

热点阅读