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) //等待其它协程处理

}

猜你喜欢

转载自blog.csdn.net/tsxw24/article/details/69044385