1.channel的应用场景
输出数据给其他方使用(协程间通讯)
组合多个逻辑(select+channel实现多个逻辑)
func task1(ch chan<- string) {
time.Sleep(2 * time.Second) // 模拟耗时操作
ch <- "Task 1 completed"
}
func task2(ch chan<- string) {
time.Sleep(1 * time.Second) // 模拟耗时操作
ch <- "Task 2 completed"
}
func task3(ch chan<- string) {
time.Sleep(3 * time.Second) // 模拟耗时操作
ch <- "Task 3 completed"
}
func main() {
ch1 := make(chan string)
ch2 := make(chan string)
ch3 := make(chan string)
// 启动多个任务
go task1(ch1)
go task2(ch2)
go task3(ch3)
// 使用 select 等待多个通道
for i := 0; i < 3; i++ {
select {
case msg1 := <-ch1:
fmt.Println(msg1)
case msg2 := <-ch2:
fmt.Println(msg2)
case msg3 := <-ch3:
fmt.Println(msg3)
}
}
fmt.Println("All tasks completed.")
}
2.channel的数据结构
3.channel如何保证线程安全
通过hchan中的lock字段保证线程安全
4.有缓存区的channel和无缓存区的channel的区别