Golang学习日志 ━━ 单向通道在函数中作为参数和返回值时的具体表现

单向通道并不难理解,<-表示方向是入还是出,主要是应用起来有点拗,下面举个例子,分别在函数的参数和返回值中放入了单项通道,看一下取值时分别是什么结果

// 单向通道:一般只在参数中限制通道方向是取值还是输入
// 现在返回值第二个只写,这会导致运用这个函数的时候,能获取到channel的内存地址,但是获取不到其中存着的值
func danxiangtongdao(i chan<- int, j <-chan int) (<-chan int, chan<- int) {
	
	fmt.Println("dxtd通道内存量:", len(i))

	//i只能写,不能取
	//x := <-i
	//通道为引用类型,i和j指向的都是同一个通道
	i <- 20
	fmt.Println("dxtd通道存入一个20")
	fmt.Println("dxtd通道内存量:", len(i))

	//========从通道内第一次取值
	y := <-j
	//通道为引用类型,此次获取的值为函数外传入通道的值10
	fmt.Println("函数内第一次通道取值:", y)
	y++
	fmt.Println("dxtd通道内存量:", len(i))

	//创建p通道并写入
	var p = make(chan int, 1)
	p <- y

	//========从通道内第二次取值
	y = <-j
	//由于通道是引用类型,此次获取的值为本函数内传入的20
	fmt.Println("函数内第二次通道取值:", y)
	y--
	fmt.Println("dxtd通道内存量:", len(i))

	//创建q通道并写入
	var q = make(chan int, 1)
	q <- y

	//========关闭通道,不是销毁,不影响获取已有的值
	close(p)
	close(q)

	//========返回两个通道,状态一个可读,一个可写
	return p, q
}

func main(){
	fmt.Println("==============单向通道=============")
	
	//创建dxtd通道,允许有两个值
	//因为本例中此通道传入函数后首先就做了一次写入操作,如果不是2,则会因通道存量不够而提示死锁deadlock
	var dxtd = make(chan int, 2)
	//通道存值
	dxtd <- 10
	fmt.Println("dxtd通道存入一个10")
	//由于通道是引用类型,如果此处关闭通道则函数中将不能修改本通道
	//close(dxtd)

	//通道作为参数传给函数danxiangtongdao(),并返回两个方向不同的单向通道
	dxtd1, dxtd2 := danxiangtongdao(dxtd, dxtd)
	//获取dxtd1通道内的值
	dxtd3 := <-dxtd1
	//由于dxtd2通道只写,因此取不到dxtd2内的值
	//dxtd4 := <-dxtd2

	//获取dxtd通道内现在的存量
	dxtdnow := len(dxtd)
	//关闭dxtd通道
	close(dxtd)

	fmt.Printf("原dxtd为%#v【其存量为%#v】\n函数的两个返回通道如下\n第一个:%#v【只读,存有的值为%#v】\n第二个:%#v【只写,取不到】\n", dxtd, dxtdnow, dxtd1, dxtd3, dxtd2)
}

// 打印内容:
// ==============单向通道=============
// dxtd通道存入一个10
// dxtd通道内存量: 1
// dxtd通道存入一个20
// dxtd通道内存量: 2
// 函数内第一次通道取值: 10
// dxtd通道内存量: 1
// 函数内第二次通道取值: 20
// dxtd通道内存量: 0
// 原dxtd为(chan int)(0xc00001a0e0)【其存量为0】
// 函数的两个返回通道如下
// 第一个:(<-chan int)(0xc00001a150)【只读,存有的值为11】
// 第二个:(chan<- int)(0xc00001a1c0)【只写,取不到】

通道的特性

=== 陆续总结 ===

  1. 通道内放入值后只要取一次,其值就在通道内消失了,再取值就是下一个值了,是个动态的过程;
  2. 通道缓冲池内设定允许存放的数量,存满后再存入会出错,空值时进行取出操作也会出错;
  3. 通道内存放的内容如果比较大,则建议存放指针;
发布了44 篇原创文章 · 获赞 1 · 访问量 3595

猜你喜欢

转载自blog.csdn.net/snans/article/details/104304205