golang 对通道的理解

通道有两种,一种是带缓存的;另一种是不带缓存的;带缓存的通道,只要缓存还没有满,通道就不会阻塞;不带缓存的通道,是阻塞的。下面用一个例子来说明:

package main

import (
	"time"
	"fmt"
)

func main() {
	dataChannel := make(chan int, 1)
	exitChannel := make(chan bool)

	defer close(dataChannel)
	defer close(exitChannel)

	go func(data <- chan int, exit <- chan bool) {
		for {
			select {
				case <- data:
					v := <- data
					fmt.Printf("销售数据: %d\n", v)
				case <- exit:
					fmt.Println("线程退出")
					break
				default:
					time.Sleep(100*time.Millisecond)
			}
		}
	}(dataChannel, exitChannel)
	data := 1
	for i := 0; i < 20; i++ {
		fmt.Println("生产数据: ", data)
		dataChannel <- data
		data++
		time.Sleep(1*time.Second)
	}
	exitChannel <- true
	fmt.Println("程序结束")

}


从打印的结果来看,当数据通道dataChannel满的时候,就阻塞了(dataChannel通道带了一个缓存)。很直观

猜你喜欢

转载自blog.csdn.net/jujueduoluo/article/details/80192406
今日推荐