Go:select时,如果通道已经关闭会怎么样?

1.for循环里被关闭的通道

package main

import (
	"fmt"
	"time"
)

func main() {
	c := make(chan int)
	go func() {
		time.Sleep(time.Second)
		c <- 10
		close(c)
	}()
	for {
		select {
		case x, ok := <-c:
			fmt.Println(x, ok)
			time.Sleep(500 * time.Millisecond)
		default:
			fmt.Println("xxx")
			time.Sleep(500 * time.Millisecond)
		}
	}
}
xxx
xxx
10 true
0 false
0 false
0 false
0 false

2.怎么样才能不读关闭后通道

package main

import (
	"fmt"
	"time"
)

func main() {
	c := make(chan int)
	go func() {
		time.Sleep(time.Second)
		c <- 10
		close(c)
	}()
	for {
		select {
		case x, ok := <-c:
			fmt.Println(x, ok)
			time.Sleep(500 * time.Millisecond)
			if !ok {
				c = nil
			}
		default:
			fmt.Println("xxx")
			time.Sleep(500 * time.Millisecond)
		}
	}
}

3.如果select里只有一个已经关闭的case,会怎么样?

package main

import (
	"fmt"
	"time"
)

func main() {
	c := make(chan int)
	go func() {
		time.Sleep(time.Second)
		c <- 10
		close(c)
	}()
	for {
		select {
		case x, ok := <-c:
			fmt.Println(x, ok)
			time.Sleep(500 * time.Millisecond)
		}
	}
}

10 true
0 false
0 false
0 false
0 false

4.select里只有一个已经关闭的case,置为nil,会怎么样?

panic
posted @   朝阳1  阅读(13)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
历史上的今天:
2023-11-01 【mysql】回表、覆盖索引、索引下推
点击右上角即可分享
微信分享提示