问答详情
源自:8-4 go语句初探

有一个缓存位置的通道,在被接收数据之前也是阻塞的吗?

package main


import (

    "fmt"

)

func main() {

    ch := make(chan int 1)

       go func() {

        fmt.Println("1")

        ch <- 1

    }()

    <-ch

    go func() {

       fmt.Println("2")

        ch <- 1

    }()

    <-ch

    go func() {

        fmt.Println("3")

        ch <- 1

    }()

    <-ch

}

把上面的1个缓存通道去掉,改成非缓存通道,程序还是可以执行的。请问有一个缓存位置的通道,在被接收数据之前也是和非缓存通道一样,是阻塞的吗?

提问者:qq_慕圣411555 2019-04-07 12:40

个回答

  • 记忆浅谈
    2019-04-08 16:09:19
    已采纳

    这里的‘在被接受数据之前’指的是ch<-1存数据吧。

    缓冲的channel:保证往缓冲中存数据先于对应的取数据,简单说就是在取的时候里面肯定有数据,否则就因取不到而阻塞。所以缓冲的channel可能在取数据的时候发生阻塞。

    非缓冲的channel:保证取数据先于存数据,就是保证存的时候肯定有其他的goroutine在取,否则就因放不进去而阻塞。所以非缓冲的channel可能在存数据的时候会发生阻塞。