go语言通道channel使用总结

1.广播

当一个通道关闭时, 所有此通道的读取都会退出阻塞. 利用此特性可以实现广播功能

package main

import (
    "fmt"
    "time"
)

func main() {
    c := make(chan bool)

    for i := 0; i < 5; i++ {
        go func(n int) {
            <-c //读取到数据或通道关闭时会退出阻塞
            fmt.Println("收到通知:", n)
        }(i)

    }

    fmt.Println("广播通知")
    close(c) //关闭通道, 广播通知

    time.Sleep(time.Second * 1) //等待其它协程处理

}

2.同时读取多个通道

有时需要监视多个通道, 这个时候可以使用select

package main

import (
    "fmt"
    "time"
)

func main() {
    c1 := make(chan int)
    c2 := make(chan int)

    go func() {
        var n int
        select {
        case n = <-c1:
        case n = <-c2:
        }
        fmt.Println("数据:", n)
    }()

    fmt.Println("写入")
    c1 <- 1
    //c2 <- 2

    close(c1)
    close(c2)

    time.Sleep(time.Second * 1) //等待其它协程处理

}

3.超时

channel本身无法设置超时, 可以使用select和定时器实现超时功能

package main

import (
    "fmt"
    "time"
)

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

    go func() {
        timeout := false
        var n int

        select {
        case n = <-c:
        case <-time.After(time.Second * 1):
            timeout = true
        }

        if timeout {
            fmt.Println("超时")
        } else {
            fmt.Println("读取到数据:", n)
        }
    }()

    time.Sleep(time.Second * 2)
    c <- 2

    time.Sleep(time.Second * 3) //等待其它协程处理

}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值