关于go:Go题库7介绍一下通道

4次阅读

共计 1052 个字符,预计需要花费 3 分钟才能阅读完成。

面试企业 知乎

题目解析 GOLANG ROADMAP 社区

答案 1(栾龙生)

如果说 goroutine 是 Go 程序并发的执行体,通道就是它们之间的连贯。通道能够使一个 goroutine 发送特定值到另一个 goroutine 的通信机制。每一个通道都是一个具体类型的导管,叫做通道的元素类型。例如一个具备 int 类型元素的通道写为chan int

通道是一个用 map 创立的数据结构的援用。当复制或者作为参数传递到一个函数时,复制的是援用,这样调用者和被调用者都援用同一份数据结构。和其余援用类型一样,通道的零值是 nil。

通道有两个次要操作:发送 (send) 和接管 (receive),两者统称为通信。send 语句从一个 goroutine 传输一个值到另一个在执行接管表达式的 goroutine。两个操作都应用<- 操作符书写。发送语句中,通道和值别离在 <- 的左右两边。在接管表达式中,<-放在通道操作数后面,在接管表达式中,其后果未被应用也是非法的。

ch <- x        // 发送语句
x = <-ch    // 接管语句
<-ch        // 接管语句,抛弃后果

通道反对第三个操作:敞开 (close),它设置一个标记位来批示值以后曾经发送结束,这个通道前面没有值了;敞开后的发送操作将导致宕机。在一个曾经敞开的通道上进行接管操作,将获取所有曾经发送的值,直到通道为空;这时任何接管操作会立刻实现,同时获取到一个通道元素对应的零值。通过调用内置的 close 函数来敞开通道:

close(ch)

依据通道的容量,能够将通道分为无缓冲通道和缓冲通道

  • 无缓冲通道
  ch = make(chan int)
  ch = make(chan int, 0)
  • 有缓冲通道
  ch = make(chan int, 3)

依据通道传输方向,还能够通道分为双向通道,只读通道和只写通道

  • 只读通道

    只能发送的通道,容许发送但不容许接管

  chan<- int
  • 只写通道

    只能接管的通道,容许接管但不容许发送

  <-chan int

答案 2(溪尾)

通道类型的值自身就是并发平安的。在申明并初始化一个通道时,能够应用内建函数 make,传给这个函数第一个参数为通道具体类型的字面量(如:chan int),还能够接一个可选的整形参数作为通道的容量,然而这个整形数据不能小于零。

通道相当与一个先进先出(FIFO)的队列,各个元素严格依照发送顺序排列,先被发送的肯定会被先接管。应用操作符示意 <-

如果定义通道时未指定通道的长度,那么该通道的长度为 0,没有缓冲,即发送一个数据之后,通道就会阻塞,直到该元素被接管。如果定义的长度为 n(n 为正整数),那么通道的长度即为 n。

正文完
 0