Golang

关注公众号 jb51net

关闭
首页 > 脚本专栏 > Golang > Go向已关闭chan读写数据

浅析Golang如何向已关闭的chan读写数据

作者:梦_鱼

这篇文章主要为大家详细介绍了Golang如何向已关闭的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)
	}
}

到此这篇关于浅析Golang如何向已关闭的chan读写数据的文章就介绍到这了,更多相关Go向已关闭chan读写数据内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文