Go语言中Channel

作者: ropon 分类: Go 发布时间: 2019-12-19 16:57
package main

//通道
//通过通道共享内存(先入先出)

//channel 是一种类型 是引用类型 空值nil
//语法
//var 变量 chan 元素类型
//var ch1 chan int
//var ch2 chan bool

//需要通过make初始化
//make(chan 元素类型, [缓冲大小])

//var ch3 = make(chan []int)
//var ch4 = make(chan []string)

//操作
//发送 send 接收 receive 关闭 close
//发送和接收都使用 <-

//对一个关闭的通道发送值会导致panic
//接收 一个关闭的通道  会一直获取值 知道通道为空
//接收 一个关闭且没有值的通道 会得到对应类型的零值
//关闭一个已经关闭的通道会导致panic

//无缓冲的通道 = 阻塞通道 只能在有人接收值的时候才能发送值(必须有接收才能发送) = 同步通道
//有缓冲通道 make(chan int, x) x变量通道能存放元素的数量
//可以通过len 获取通道内元素的数量 cap获取通道的容量

//从通道中循环取值 for range

//单向通道 限制通道只能接收或发送

//chan<- int 只能发送的通道(可以发送不能接收)
func counter(out chan<- int)  {
	for i := 0; i < 100; i++ {
		out <- i
	}
	close(out)
}

//<- chan int 只能接收的通道(可以接收不能发送)
func squarer(out chan <- int, in <- chan int)  {
	for i := range in {
		out <- i
	}
	close(out)
}

//func rec(c chan int)  {
//	ret := <- c
//	fmt.Println("接收成功", ret)
//}

func main() {
	//定义一个有缓冲的通道
	////ch5 := make(chan int, 1)
	//ch5 := make(chan int)
	//go rec(ch5)
	////把10发送到ch5通道中
	//ch5 <- 10
	//fmt.Println("发送成功")

	//从ch5通道接收值赋给变量a
	//a := <- ch5
	//从ch5通道接收值丢弃
	//<- ch5

	//关闭通道
	//close(ch5)
	//fmt.Println(a)

	//ch := make(chan int, 5)
	//对一个关闭的通道发送值会导致panic
	//close(ch)
	//ch <- 10
	//接收 一个关闭的通道  会一直获取值 知道通道为空
	//ch <- 10
	//close(ch)
	//x := <- ch
	//fmt.Println(x)
	//接收 一个关闭且没有值的通道 会得到对应类型的零值
	//close(ch)
	//x := <- ch
	//fmt.Println(x)
	//关闭一个已经关闭的通道会导致panic
	//close(ch)
	//close(ch)

	//循环取值
	//ch1 := make(chan int)
	//ch2 := make(chan int)
	//
	//go func() {
	//	for i := 0; i < 10; i++ {
	//		ch1 <- i
	//	}
	//	close(ch1)
	//}()
	//
	//go func() {
	//	for {
	//		ok判断通道是否关闭 ok为false 说明通道已关闭
	//		i, ok := <-ch1
	//		if !ok {
	//			break
	//		}
	//		ch2 <- i * i
	//	}
	//	close(ch2)
	//}()
	//
	//for i := range ch2 {
	//	fmt.Println(i)
	//}

	////单向通道
	//ch1 := make(chan int)
	//ch2 := make(chan int)
	//
	//go counter(ch1)
	//go squarer(ch2, ch1)
	////循环获取通道中值
	//for i := range ch2 {
	//	fmt.Println(i)
	//}
}

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!