go学习笔记并发-channel

定义

引用类型channel是CSP模式的具体实现,用于多个goroutine通讯。其内部实现了同步没确保并发安全,默认为同步模式,需要发送和接收配对。否则会被阻塞,直到另一方准备好被唤醒
package main

import (
    "fmt"
)

func main() {
    data := make(chan int)      //数据交换队列
    exit := make(chan bool)     //退出通知

    go func() {
        for d := range data {   //从队列迭代接收数据,直到close
            fmt.Println(d)
        }

        fmt.Println("recv over.")
        exit <- true            //发送退出通知
    }()

    data <- 1                   //发送数据
    data <- 2
    data <- 3
    close(data)                 //关闭队列

    fmt.Println("send over.")
    <-exit                      //等待退出通知
}
异步方式通过判断缓冲区来觉得是否阻塞,如果缓冲区已满,发送被阻塞;缓冲区为空,接收被阻塞
package main

import (
    "fmt"
)

func main() {
    data := make(chan int, 3)
    exit := make(chan bool)
    data <- 1
    data <- 2
    data <- 3
    go func() {
        for d := range data {
            fmt.Println(d)
        }

        exit <- true
    }()

    data <- 4
    data <- 5
    close(data)

    <- exit
}
可以将channel隐士转换为单向队列,只收或只发
package main

import (
)

func main() {
    c := make(chan int, 3)
    var send chan <- int = c
    var recv <- chan int = c
    send <- 1
    //<- send           //receive from send-only type chan<- int
    //recv <- 2         //send to receive-only type <-chan int
    <- recv
}
如果同时处理多个channel,可使用select语句,它随机选择一个可用channel做收发操作,或执行default case
坚持原创技术分享,您的支持将鼓励我继续创作!