Golang并发、Channel以及异常处理
如果说 goroutine 是Go程序并发的执行体,channel就是它们之间的连接。channel是可以让一个 goroutine 发送特定值到另一个 goroutine 的通信机制,信道是引用类型,初始化为nil
Go 语言中的通道(channel)是一种特殊的类型。通道像一个传送带或者队列,总是遵循先入先出(First In First Out)的规则,保证收发数据的顺序。每一个通道都是一个具体类型的导管,也就是声明channel的时候需要为其指定元素类型
var 信道实例 chan 信道类型 // 创建信道
信道实例 := make(chan 信道类型) // 创建并实例化信道
func Printhello(c chan string) {
fmt.Println("其他goroutine执行开始")
c<-"hello" // 往信道中放值
}
func main() {
fmt.Println("主goroutine执行开始")
// 信道是一种类型,定义信道
var a chan string=make(chan string) // chan是信道类型关键字,string表示信道到存string类型,使用make进行初始化
go Printhello(a) // 执行其他goroutine
b:=<-a // 接收其他goroutine往信道中取值
fmt.Println(b) // hello
fmt.Println("主goroutine执行结束")
}
// 将信道中存值为空接口类型可放任意类型数据
var a chan interface{}=make(chan interface{})
// 信道的取值和赋值默认都是阻塞的
func main() {
var c chan int=make(chan int)
fmt.Println("主goroutine")
go Recive(c)
c<-1 // 由goroutine发送就必须由goroutine接收,否则会报死锁
}
func Recive(c chan int){
d:=<-c
fmt.Println("信道中取值",d)
}
// 缓冲信道和无缓冲信道
// 创建有缓冲信道,允许信道里存储一个或多个数据,这意味着,设置了缓冲区后,发送端和接收端可以处于异步的状态;无缓冲信道的个数为0,在信道里无法存储数据,这意味着,接收端必须先于发送端准备好,以确保你发送完数据后,有人立马接收数据,否则发送端就会造成阻塞,原因很简单,信道中无法存储数据,也就是说发送端和接收端是同步运行的。
var a chan int= make(chan int, 3)
a<-999
a<-866
fmt.Println(<-a)
go Recive(a)
// 长度和容量:长度(信道中有几个值),容量(初始化容量大小)
fmt.Println(len(a))
fmt.Println(cap(a))
// 双向信道和单向信道
复制代码