首页 > 其他分享 >Golang 向已关闭的chan读写数据会怎样

Golang 向已关闭的chan读写数据会怎样

时间:2024-02-02 21:11:45浏览次数:25  
标签:个值 值为 读写 chan schoolChan Golang 关闭 main

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)
	}
}

标签:个值,值为,读写,chan,schoolChan,Golang,关闭,main
From: https://www.cnblogs.com/2bjiujiu/p/18004009

相关文章

  • -bash: warning: setlocale: LC_ALL: cannot change locale (en_US.UTF-8)
    问题ssh刚登录连接时警告:Failedtosetlocale,defaultingtoC或2.linux运行命令时先报错:Failedtosetlocale,defaultingtoC系统已经设置了默认地区_语言.字符集为en_US.UTF-8,但是在系统中没有定义对应的locale文件,只需要手动生成这个locale文件即可解决:查......
  • Golang中make和new的区别
    1.相同点都是内建函数,都是在堆上分配内存,都需要传递类型参数2.不同点传递的参数不一样,new函数只接收一个参数,make函数可以接收一个以上的参数packagemainimport"fmt"funcmain(){ //int类型0值的指针,返回的值是以0x开头的16进制整数,参数个数为1 intZeroValueP......
  • linux c++读写ini文件,不是用boost
    摘自:https://linuxcpp.0voice.com/?id=65276可以使用标准库中的fstream和string类来读写ini文件。以下是一个示例代码:#include<iostream>#include<fstream>#include<sstream>#include<map>usingnamespacestd;//解析ini文件,返回一个键值对的mapmap<string,string......
  • golang 正则过滤sql注入的方法
    该方法返回的是一个bool值packagemainimport"regexp"import"fmt"//正则过滤sql注入的方法//参数:要匹配的语句funcFilteredSQLInject(to_match_strstring)bool{//过滤‘//ORACLE注解--/**///关键字过滤update,delete//正则的字符......
  • golang中 UTF-8 和GBK格式的转换
    funcmain(){ str:="测试" utf8By:=[]byte(str) gbkBy,_:=Utf8ToGbk(utf8By) //直接打印用string转类型的gkb字节数组,会乱码 fmt.Println("打印GBK",string(gbkBy)) fmt.Println("UTF8字节长度:",len(utf8By),"GBK字节长度:",len(gbkBy)) ......
  • golang 使用hex包,转换文件的16进制字符、16进制字节数组
    某些特殊情况下需要根据文件的16进制转换成字符在linux系统用vim保存一个文件,写入两行内容这是测试A这是测试B用linux的xxd命令输出文件的16进制字节数组xxd-g1-it.txtunsignedchart_txt[]={0xe8,0xbf,0x99,0xe6,0x98,0xaf,0xe6,0xb5,0x8b,0x......
  • golang gin框架搭建restapi
    初学golang,尝试用gin框架搭建restapi一)源码准备创建go.mod文件,相当于nodejs中的package.jsongomodinitexamples/web-service-gin新建文件main.go,加入以下代码packagemainimport( "net/http" "github.com/gin-gonic/gin")//albumrepresentsdataaboutarecor......
  • wpf 数据绑定 INotifyPropertyChanged封装
    BindableBase.cspublicabstractclassBindableBase:INotifyPropertyChanged{publiceventPropertyChangedEventHandlerPropertyChanged;//调用方法:publicstringName{get=>name;set{SetProperty<string>(refname,value);}}......
  • Golang学习(三)基本语法[变量、常量、类型、类型转换]
    变量声明Go语言中有四类标记:标识符(identifiers)、关键字(keywords)、运算符(operators)标点符号(punctuation)以及字面量(literals)。Go语言变量标识符由字母、数字、下画线组成,其中首字符不能为数字,同一字母的大小写在Go语言中代表不同标识。在Go语言中,命名标识符时,通常选择英文的52个大......
  • Golang不可不知的7个并发概念
    Golang不可不知的7个并发概念原创 俞凡DeepNoMind DeepNoMind 2024-01-1311:08 发表于上海 听全文并发性支持是Golang最重要的原生特性之一,本文介绍了Golang中和并发性相关的7个概念。原文: Golang:7must-knowconcurrencyrelatedconcepts[1]并发是Go编程......