channel 的关闭
使用close函数可以关闭channel,channel关闭后,不能再向channel写入数据,但任然可以从channel读取数据
package main
import "fmt"
func main(){
var ch = make(chan int,10)
ch <- 1
ch <- 2
ch <- 3
ch <- 4
ch <- 5
close(ch)
//上面已经将管道关闭,此处不能再像管道添加数据
//ch <- 6
//管道的关闭不影响从管道读取数据
n1 := <- ch
n2 := <- ch
fmt.Println(n1,n2)
}
channel 的循环
for {
select {
case val := <- numChan:
fmt.Println(val)
default:
//没有数据
fmt.Println("未获取到数据")
}
}
channel 等待
package main
import (
"fmt"
"sync"
)
//将1-2000的数放入管道中
func appendNum(ch chan <- int ){
defer wg.Done()
for i:= 1 ;i<=2000 ;i++ {
ch <- i
}
close(ch)
}
//计算阶加
func calcNum(ch chan <- map[int]int,numChan <- chan int){
defer wg.Done()
for {
num,ok := <- numChan
if !ok {
break
}
res := 0
for i:=1;i<=num ;i++ {
res += i
}
m := map[int]int{}
m[num] = res
ch <- m
}
}
var wg sync.WaitGroup
func main(){
var numChan = make(chan int,2000)
var resChan = make(chan map[int]int,2000)
wg.Add(1)
go appendNum(numChan)
for i:= 0 ;i<8;i++{
wg.Add(1);
go calcNum(resChan,numChan)
}
wg.Wait()
close(resChan)
for val := range resChan {
fmt.Println(val)
}
}
异常捕获
package main
import (
"fmt"
"sync"
)
func fun1(){
defer wg.Done()
defer err()
for i:= 0 ;i<10;i++{
fmt.Println(i)
}
}
func fun2(){
defer wg.Done()
defer err()
var m map[string]int
m["gangan"] = 1
}
//捕获异常
func err(){
err := recover()
if err != nil{
fmt.Println(err)
}
}
var wg sync.WaitGroup
func main(){
wg.Add(2)
go fun1()
go fun2()
wg.Wait()
fmt.Println("system exit")
}