Go学习打卡Day10 并发编程—channel

94 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第10天,点击查看活动详情

Go学习打卡Day10 并发编程—channel

1、基础概念

  • goroutine 是Go程序并发的执行体,channel就是它们之间的连接。
  • channel是可以让一个 goroutine 发送特定值到另一个 goroutine 的通信机制。
  • Go 语言中的通道(channel)是一种特殊的类型。通道像一个队列,遵循先入先出的规则,保证收发数据的顺序。
  • 每一个通道都是一个具体的类型,也就是声明channel的时候需要为其指定元素类型。

2、channel类型

var 变量名称 chan 元素类型      //声明通道类型变量
make(chan 元素类型, [缓冲大小]) //初始化channel
  • chan:是关键字
  • 元素类型:是指通道中传递元素的类型
  • 通道共有发送(send)、接收(receive)和关闭(close)三种操作。而发送和接收操作都使用<-符号。
ch := make(chan int)
​
//将一个值发送到通道中。
ch <- 1 // 把1发送到ch中//从一个通道中接收值。
x := <- ch // 从ch中接收值并赋值给变量x
<-ch       // 从ch中接收值,忽略结果close(ch)

注意: 一个通道值是可以被垃圾回收掉的。通道通常由发送方执行关闭操作,并且只有在接收方明确等待通道关闭的信号时才需要执行关闭操作。它和关闭文件不一样,通常在结束操作之后关闭文件是必须要做的,但关闭通道不是必须的。

  • 对一个关闭的通道再发送值就会导致 panic。
  • 对一个关闭的通道进行接收会一直获取值直到通道为空。
  • 对一个关闭的并且没有值的通道执行接收操作会得到对应类型的零值。
  • 关闭一个已经关闭的通道会导致 panic。

3、代码实例

package main
​
import (
    "fmt"
)
​
func main() {
​
    // 构建一个通道
    ch := make(chan int)
​
    // 开启一个并发匿名函数
    go func() {
​
        fmt.Println("start---")
​
        // 通过通道通知main的goroutine
        ch <- 0
​
        fmt.Println("exit---")
​
    }()
​
    fmt.Println("wait---")
​
    // 等待匿名goroutine
    <-ch
​
    fmt.Println("all done")
​
}
/*
wait---
start---
exit---
all done
*/
  • 构建一个同步用的通道。
  • 开启一个匿名函数的并发。
  • 匿名 goroutine 即将结束时,通过通道通知 main 的 goroutine,这一句会一直阻塞直到 main 的 goroutine 接收为止。
  • 开启 goroutine 后,马上通过通道等待匿名 goroutine 结束。