本文共 1865 字,大约阅读时间需要 6 分钟。
单向通道并不难理解,<-
表示方向是入还是出,主要是应用起来有点拗,下面举个例子,分别在函数的参数和返回值中放入了单项通道,看一下取值时分别是什么结果
// 单向通道:一般只在参数中限制通道方向是取值还是输入// 现在返回值第二个只写,这会导致运用这个函数的时候,能获取到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)【只写,取不到】
=== 陆续总结 ===
转载地址:http://ovkpi.baihongyu.com/