美文网首页go
make(chan int) 和 make(chan int,

make(chan int) 和 make(chan int,

作者: lesliefang | 来源:发表于2017-12-02 14:27 被阅读14次

弄懂了下面的这个例子你就懂了

package main

import "fmt"

func main() {
    var c = make(chan int)
    var a string

    go func() {
        a = "hello world"
        <-c
    }()

    c <- 0
    fmt.Println(a)
}

上面的例子会打印 "hello world"

如果改成 var c = make(chan int, 1) a 可能是 "hello world" 也可能是空,我运行了好多次基本打印的都是空

make(chan int) 是 unbuffered channel, send 之后 send 语句会阻塞执行,直到有人 receive 之后 send 解除阻塞,后面的语句接着执行。
所以执行 c <- 0 时会阻塞,直到 <-c, 这时 a 已赋值。

make(chan int, 1) 是 buffered channel, 容量为 1。在 buffer 未满时往里面 send 值并不会阻塞, 只有 buffer 满时再 send 才会阻塞,所以执行到 c <- 0 时并不会阻塞 fmt.Println(a) 的执行,这时 a 可能是 "hello world" 也可能是空, 看两个 goroutine 谁执行的更快

我如果在 fmt.Println(a) 之前加一些耗时操作,很有可能打印的还是 "hello world", 因为给 a 赋值的语句已经执行完了

func main() {
    var c = make(chan int, 1)
    var a string

    go func() {
        a = "hello world"
        <-c
    }()

    c <- 0
    // 模拟耗时操作
    sum := 0
    for i := 0; i < 100000; i++ {
        sum += i*23 + 45 - 7*4/2 - 99
    }
    fmt.Println(a)
}

相关文章

  • make(chan int) 和 make(chan int,

    弄懂了下面的这个例子你就懂了 上面的例子会打印 "hello world" 如果改成 var c = make(...

  • go channel

    channel channel一般用于goroutine之间的通信;初始化chan :=make(chan int...

  • golang-channel

    缓冲的 chan, make(chan int, 缓冲大小): 表示满了 缓冲大小后 就开始堵塞,无法在往 管道 ...

  • golang通道channel高级

    单向通道   only_read := make(<-chan int,1) //只能发送通道  only_w...

  • golang 通道channel 基础

     声明一个通常的基本语法:channel := make(chan int,0)  当容量为0时,我们可以称通道为...

  • 有缓冲channel

    有缓冲channel通道容量可自定义,可用于数据传递。声明方式:ch := make(chan int, 3)长度...

  • 2018-05-18

    var nilCh chan intfmt.Println(nilCh)ch := make(chan error...

  • Go channel-2

    缓冲通道 非缓冲通道: make(chan T)一次发送,一次接受,都是阻塞式的 缓冲通道:make(chan T...

  • 闭包作为Go程在运行时会发生什么?

    package mainimport ("fmt") func main() {done := make(chan...

  • chan

    chan 不带缓存 make(chan 数据类型) 进和出都会阻塞. 读和写同时存在,才会同时退出阻塞。如果只...

网友评论

    本文标题:make(chan int) 和 make(chan int,

    本文链接:https://www.haomeiwen.com/subject/zisnbxtx.html