280_尚硅谷_管道的注意事项和细节(2)

1.channel使用细节和注意事项1.channel使用细节和注意事项

2.3) 使用slect 可以解决从管道取数据的阻塞问题【案例演示】_代码2.3) 使用slect 可以解决从管道取数据的阻塞问题【案例演示】

package main

import (
	"fmt"
	"time"
)

// todo  3) 使用slect 可以解决从管道取数据的阻塞问题【案例演示】
func main() {
	// 1. 定义一个管道 10个数据int
	intChan := make(chan int, 10)
	for i := 0; i < 10; i++ {
		intChan <- i
	}
	// 2. 定义一个管道 5个数据string
	stringChan := make(chan string, 5)
	for i := 0; i < 5; i++ {
		stringChan <- "hello" + fmt.Sprintf("%d", i)
	}

	// 传统的方法在遍历管道时如果不关闭会阻塞而导致死锁(deadlock)

	// 问题, 在实际开发中,可能不好确定管道关闭时间
	// 可以使用select方式可以解决
	for {
		select {
		// 注意: 这里如果intChan一直没有关闭,不会一直阻塞而deadlock,会自动到下一个case分支
		case v := <-intChan:
			fmt.Printf("从intChan读取的数据%d\n", v)
			time.Sleep(time.Second)
		case v := <-stringChan:
			fmt.Printf("从stringChan读取的数据%s\n", v)
			time.Sleep(time.Second)
		default:
			// ! 取不到数据直接renturn退出函数
			fmt.Printf("都取不到数据\n")
			time.Sleep(time.Second)
			return
		}
	}

}

3.3) 使用slect 可以解决从管道取数据的阻塞问题【案例演示】_运行结果3.3) 使用slect 可以解决从管道取数据的阻塞问题【案例演示】_运行结果

 

posted on 2026-03-07 21:17  与太阳肩并肩  阅读(0)  评论(0)    收藏  举报

导航