Golang学习笔记(十九):Channel初步接触

https://juejin.im/post/5c94e6d4e51d453eb46102de

Go语言是原生支持并发编程的,而Channel正是Go语言中实现并发不可或缺的类型,一起来学习一下吧。

什么是channel

我们知道gotoutine是Go语言中的并发执行单元,我们可以创建多个goroutine实现程序的并发,而goroutine之间的通讯机制则由 channel来实现。

channel是Go语言中的一种特殊类型,我们可以声明一个channel可以发送的类型,然后通过向channel发送或接收值到达通讯的目的。

channel的创建

使用关键字chan后跟一个可发送的数据类型,这样就可以声明一个channel变量,如下所示

  1. var ch chan int

channel是引用类型,因此刚声明的channel而未初始化的变量初值是nil,向未初始化的channel类型发送数值,会引发panic错误,可以使用make方法初始化channel:如下所示

  1. ch = make(chan int)

经过make方法初始化的channel,会引用底层的数据结构,相同类型的channel可以进行相等比较,如果引用相同的底层结构,则为相等。所有的channel类型都可以跟nil比较。

发送与接收操作

channel的作用便用于通讯的,所以对channel有两个操作,发送和接收,在一个gotoutine发送数值,在另一个goroutine接收数值,达到通信中共享内存的目的。

  1. package main
  2. import "fmt"
  3. func main() {
  4. ch := make(chan int)
  5. go func() {
  6. for i := 0; i < 10; i++ {
  7. ch <- i
  8. }
  9. close(ch)
  10. }()
  11. for {
  12. x ,ok := <- ch
  13. if !ok{
  14. break
  15. }
  16. fmt.Println(x)
  17. }
  18. }

在上面的例子中,我们使用匿名函数创建了一个gotourine,在其中向ch发送10个数值,并发主goroutine中接收,发送完毕之后,可可使用close()函数关闭channel。

注意,如果向已关闭的channel发送数值,会引发pannic错误。如果从已关闭的channel中接收值,则会一直收该数据类型的零值,Go语言中无法判断channel是否关闭,但可以接收第二个bool类型的值来判断是否获取到有效的值,在上面的例子,使用Ok来表示这个值。

ft_authoradmin  ft_create_time2019-08-03 17:10
 ft_update_time2019-08-03 17:10