Shadow
golang里的channel通道+select
golang里的channel通道
//go 里的channel并发
package main
import (
"fmt"
"sync"
)
//channel 单通道,只能添加值
func appendChannel(ch chan<- int) {
defer wg.Done()
for i := 0; i <10; i++ {
ch <- i
}
close(ch)
}
//channel 单通道,把另一个通道的值取到另一个通道内
func addChannel(ch chan <- int,chDsc <-chan int) {
defer wg.Done()
for i := range chDsc {
ch <- i+1
}
close(ch)
}
func popChannel(ch <-chan int){
defer wg.Done()
fmt.Println("===ch4===")
for ii := range ch {
fmt.Printf("%d",ii)
}
fmt.Println("===ch4===")
}
var wg sync.WaitGroup
func main() {
//创建一个通道
var ch = make(chan int,1)
//添加值,把20放到 ch 这个通道内
ch <- 20
//关闭通道,不关闭通道会造成死锁
close(ch)
//取值
a := <- ch
fmt.Println(a)
//如果channel里没有数据了,取出来的会是类型对应的零值
fmt.Println(<- ch)
var addNum int = 10
var ch2 = make(chan int, 20)
for i := 0; i < addNum; i++ {
ch2 <- i
}
close(ch2)
//使用for循环取值
//for{
// v,err := <-ch2
// //需要判断err是否为 false,否则会死循环
// if !err{
// break
// }
// fmt.Println(v,err)
//}
//使用for range取值,推荐
for i := range ch2 {
fmt.Println(i)
}
var ch4 , ch3 = make(chan int),make(chan int)
wg.Add(1)
go appendChannel(ch3)
fmt.Println("===ch3===")
fmt.Println(len(ch3))
fmt.Println("\n===ch3===")
wg.Add(1)
go addChannel(ch4,ch3)
fmt.Println("===ch3===")
fmt.Println(len(ch3))
fmt.Println("===ch3===")
wg.Add(1)
go popChannel(ch4)
wg.Wait()
var ch5 = make(chan string, 10)
var ch6 = make(chan string, 20)
ch <- "PHP"
//select 复用如果case里有多条满足了条件,会 随机 选择一个进行匹配
select {
case ch5 <- "go":
fmt.Println("ch5里放入了go")
case v := <-ch5:
fmt.Println("ch5取了值:", v)
case v := <-ch6:
fmt.Println("ch6取了值:", v)
case ch6 <- "JS":
fmt.Println("ch6放了值")
default:
fmt.Println("什么都没操作~")
}
}
Dcr163的博客
http://dcr163.cn/591.html(转载时请注明本文出处及文章链接)