<-
// 单向通道:一般只在参数中限制通道方向是取值还是输入
// 现在返回值第二个只写,这会导致运用这个函数的时候,能获取到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)【只写,取不到】
通道的特性
=== 陆续总结 ===
- 通道内放入值后只要取一次,其值就在通道内消失了,再取值就是下一个值了,是个动态的过程;
- 通道缓冲池内设定允许存放的数量,存满后再存入会出错,空值时进行取出操作也会出错;
- 通道内存放的内容如果比较大,则建议存放指针;