一、使用select解决管道阻塞问题
package main
import (
"fmt"
"strconv"
)
func main() {
//定义一个int类型管道
intChan := make(chan int, 10)
//向管道存入数据
for i:=0;i<10 ;i++ {
intChan<- i
}
//定义一个string类型管道
stringChan := make(chan string, 5)
for i:=0;i<5 ;i++ {
stringChan<- "Cat"+strconv.Itoa(i)
}
//使用select解决管道阻塞
for{
select {
case v := <-intChan:
fmt.Println("从intChan管道读取数据",v)
case v:= <-stringChan:
fmt.Println("从intChan管道读取数据",v)
default:
fmt.Println("没有数据可取")
return
}
}
}
二、使用defer+recover解决协程崩溃
package main
import (
"fmt"
"time"
)
//定义一个函数
func test01() {
for i:=0;i<10 ;i++ {
//休眠
time.Sleep(time.Second)
fmt.Println("hello")
}
}
func test02() {
//使用defer+recover
defer func() {
if err := recover();err !=nil{
fmt.Println("test02错误")
}
}()
var Map map[string]string
Map["1"] = "1"
}
func main() {
go test01()
go test02()
for i:=0;i<10 ;i++ {
//休眠
time.Sleep(time.Second)
fmt.Println("cat")
}
}