第一个goroutine + channel 程序

2021-06-09  本文已影响0人  我爱张智容

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

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

        fmt.Println("子协程 正在运行 。。。。。 ")

        c <- 666 // 写入通道
    }()

    num := <-c // 从通道中获取数据

    fmt.Println("num = ", num)
    
    fmt.Println("主协程执行完毕。。。")
}

无缓冲通道
TODO: ......

有缓冲通道
TODO: ......

channel 模拟 生产者和消费者

//   chan<- //只写
func counter(out chan<- int) {
    defer close(out)
    for i := 0; i < 5; i++ {
        out <- i //如果对方不读 会阻塞
    }
}

//   <-chan //只读
func printer(in <-chan int) {
    for num := range in {
        fmt.Println(num)
    }
}

func main() {
    c := make(chan int) //   chan   //读写

    go counter(c) //生产者
    printer(c)    //消费者

    fmt.Println("done")
}

Ticker是一个定时触发的计时器,它会以一个间隔(interval)往channel发送一个事件(当前时间),而channel的接收者可以以固定的时间间隔从channel中读取事件。

func main() {

    ticker := time.NewTicker(time.Second * 1)

    i := 0
    go func() {

        for {
            <-ticker.C
            i++
            fmt.Println(" i := ", i)

            if i == 5 {
                ticker.Stop() // 停止定时器
            }
        }
    }()

    for {
    }
}

上一篇下一篇

猜你喜欢

热点阅读