Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
golang缓冲区通道意外结果_Go - Fatal编程技术网

golang缓冲区通道意外结果

golang缓冲区通道意外结果,go,Go,我知道如果缓冲区通道已满,发送方将阻塞,当通道可用时,发送方可以继续 为什么输出不是常数输出0-29?怎么做 变量/局部变量如何存储在goroutine中 如果很多发送者被阻止,他们是否被FIFO命令唤醒 输出不是常量,因为不同的goroutine共享相同的局部变量i。如果取消对行的注释并将其移动到goruoutine调用之前,您将看到常量输出0-29。更好的方法是将i变量移动到goroutine函数参数 规范中未指定唤醒顺序。你应该把它看成是随机的。 < P>输出不是常数,因为不同的GOOTU

我知道如果缓冲区通道已满,发送方将阻塞,当通道可用时,发送方可以继续

  • 为什么输出不是常数输出0-29?怎么做
  • 变量/局部变量如何存储在goroutine中
  • 如果很多发送者被阻止,他们是否被FIFO命令唤醒

  • 输出不是常量,因为不同的goroutine共享相同的局部变量i。如果取消对行的注释并将其移动到goruoutine调用之前,您将看到常量输出0-29。更好的方法是将i变量移动到goroutine函数参数


    规范中未指定唤醒顺序。你应该把它看成是随机的。

    < P>输出不是常数,因为不同的GOOTUTIN共享相同的局部变量I。如果取消对行的注释并将其移动到goruoutine调用之前,您将看到常量输出0-29。更好的方法是将i变量移动到goroutine函数参数

    规范中未指定唤醒顺序。你应该把它看成是随机的。

    < P > 3,它是FIFO

    1,因为在for循环中创建的goroutine不一定会按顺序执行。底层Go调度程序将随机启动一个(这是通道如何分配其值)。当然,它们都将被创建,但它们将(被安排)在
    时间点开始。调用
    main
    中的Sleep(…)
    (Go scheduler是一个协作的调度器,在某些点上执行,例如函数调用、通道操作等)

    2.直接使用该频道:

    7 9
    13 29
    13 28
    13 27
    13 26
    13 25
    13 24
    13 23
    16 22
    16 21
    17 20
    19 19
    21 18
    21 17
    23 16
    25 15
    26 14
    26 13
    26 12
    26 11
    26 10
    26 9
    26 8
    26 7
    27 6
    27 5
    13 4
    28 3
    30 2
    30 2
    
    这是先进先出

    1,因为在for循环中创建的goroutine不一定会按顺序执行。底层Go调度程序将随机启动一个(这是通道如何分配其值)。当然,它们都将被创建,但它们将(被安排)在
    时间点开始。调用
    main
    中的Sleep(…)
    (Go scheduler是一个协作的调度器,在某些点上执行,例如函数调用、通道操作等)

    2.直接使用该频道:

    7 9
    13 29
    13 28
    13 27
    13 26
    13 25
    13 24
    13 23
    16 22
    16 21
    17 20
    19 19
    21 18
    21 17
    23 16
    25 15
    26 14
    26 13
    26 12
    26 11
    26 10
    26 9
    26 8
    26 7
    27 6
    27 5
    13 4
    28 3
    30 2
    30 2
    

    1:因为goroutine是并发执行的。不要使用goroutines。2.看看你的问题。3.不,一点也不。1:因为goroutine是并发执行的。不要使用goroutines。2.看看你的问题。3.不,一点也不。
    var (
        c  = make(chan int, 2)
        wg = &sync.WaitGroup{}
    )
    
    func main() {
        wg.Add(1)
        go worker(1)
    
        wg.Add(1)
        go func() {
            defer wg.Done()
            for i := 0; i < 30; i++ {
                c <- i
            }
            close(c)
        }()
        wg.Wait()
    }
    
    func worker(id int) {
        defer wg.Done()
        for a := range c {
            println(a, runtime.NumGoroutine())
            time.Sleep(time.Second)
        }
    }
    
    var (
        wg = &sync.WaitGroup{}
    )
    
    func main() {
        for i := 0; i < 3; i++ {
            localClosure := i // <- this line
    
            wg.Add(1)
            go func() {
                defer wg.Done()
                println(localClosure)
            }()
        }
    
        wg.Wait()
    }