免费资源网 – https://freexyz.cn/

目录
  • 1. 向已关闭的chan写
  • 2. 向已关闭的chan读

1. 向已关闭的chan写

会直接panic,报 send to close channel错误

package main

func main() {
	// 创建缓冲区为4的字符串chan
	schoolChan := make(chan string, 4)
	// 放入3个值
	schoolChan <- "国防科大"
	schoolChan <- "北京大学"
	schoolChan <- "湖南大学"

	// 关闭chan
	close(schoolChan)

	// 尝试写数据,会panic: send to close channel
	schoolChan <- "中南大学"
}

2. 向已关闭的chan读

会返回2个值,若已关闭的chan中还存在值,第二个值为true,第一个值为对应的chan中的值,若已关闭的chan中不存在值,第二个值为false,第一个值为对应chan类型的零值

package main

import "fmt"

func main() {
	// 创建缓冲区为4的字符串chan
	schoolChan := make(chan string, 4)
	// 放入3个值
	schoolChan <- "国防科大"
	schoolChan <- "北京大学"
	schoolChan <- "湖南大学"

	// 关闭chan
	close(schoolChan)

	// 向已关闭的chan读
	if school, isEmpty := <-schoolChan; isEmpty {
		fmt.Println("school:", school)
	}

	// 向已关闭的chan读
	if school, isEmpty := <-schoolChan; isEmpty {
		fmt.Println("school:", school)
	}

	// 向已关闭的chan读
	if school, isEmpty := <-schoolChan; isEmpty {
		fmt.Println("school:", school)
	}

	// 向若chan不存在元素,则第二个参数的值为 false
	if school, isEmpty := <-schoolChan; isEmpty {
		fmt.Println("school:", school)
	}
}

使用for循环遍历chan,若chan未关闭则会堵塞等待chan放入元素,如chan关闭则取出chan内所有元素并终止循序

package main

import (
	"fmt"
)

func main() {
	// 创建缓冲区为4的字符串chan
	schoolChan := make(chan string, 4)
	// 放入3个值
	schoolChan <- "国防科大"
	schoolChan <- "北京大学"
	schoolChan <- "湖南大学"

	// 关闭chan
	close(schoolChan)

	// for循环遍历channel,会将已关闭的chan中缓冲区的数据取出完后终止循序
	for school := range schoolChan {
		fmt.Println("school:", school)
	}
}

免费资源网 – https://freexyz.cn/

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。