Go语言 之定义channel变量

和map类似,channel也一个对应make创建的底层数据结构的引用。

当我们复制一个channel或用于函数参数传递时,我们只是拷贝了一个channel引用,因此调用者和被调用者将引用同一个channel对象。和其它的引用类型一样,channel的零值也是nil

定义一个channel时,也需要定义发送到channel的值的类型。channel可以使用内置的make()函数来创建:

chan是创建channel所需使用的关键字。Type 代表指定channel收发数据的类型。

make(chan Type)  //等价于make(chan Type, 0)

make(chan Type, capacity)

当 参数capacity= 0 时,channel 是无缓冲阻塞读写的;当capacity > 0 时,channel 有缓冲、是非阻塞的,直到写满 capacity个元素才阻塞写入。

channel非常像生活中的管道,一边可以存放东西,另一边可以取出东西。channel通过操作符 <- 来接收和发送数据,发送和接收数据语法:

    channel <- value      //发送value到channel

    <-channel             //接收并将其丢弃

    x := <-channel        //从channel中接收数据,并赋值给x

    x, ok := <-channel    //功能同上,同时检查通道是否已关闭或者是否为空

默认情况下,channel接收和发送数据都是阻塞的,除非另一端已经准备好,这样就使得goroutine同步变的更加的简单,而不需要显式的lock。

package main

import (
    "fmt"
)

func main() {
    c := make(chan int, 0)

    go func() {
        defer fmt.Println("子协程结束")

        fmt.Println("子协程正在运行……")
        //发送数据6到c
        c <- 6
    }()
    //等待接收c数据赋值给num
    num := <-c

    fmt.Println(num)
    fmt.Println("main协程结束")
}

 

posted @ 2019-07-04 10:09  样子2018  阅读(2101)  评论(0编辑  收藏  举报