为什么在go例程中将值分配给变量后,变量将为空?

时间:2019-01-31 07:22:59

标签: go routines

我正在使用go例程来快速执行。我正在制作一个示例程序进行练习,但是当我在go例程中赋值后看到变量的值为空时,我感到纳闷。我正在显示我的代码:-

package main

import (
    "fmt"
)

func main() {
    var collectInt []int
    doneChan := make(chan string)
    go func() {
        for i := 0; i < 10; i++ {
            collectInt = append(collectInt, i)
        }

    }()
    fmt.Println(collectInt)
    go func() {
        doneChan <- "done"
    }()
    <-doneChan
}

播放链接https://play.golang.org/p/VgwrzR8GBzN

请告诉我在使用go例程时如何将值分配给变量。

2 个答案:

答案 0 :(得分:3)

规则是不与共享变量共享数据,而是在带有通道的go例程之间传递数据。

请参见Go proverbs

  

不要通过共享内存进行通信,而是通过通信共享内存。

collectInt设置为一个通道,并分别传递每个int:

package main

import (
    "fmt"
)

func main() {
    collectInt := make(chan int)
    go func() {
        for i := 0; i < 10; i++ {
            collectInt <- i
        }
        close(collectInt)
    }()
    for i := range collectInt {
        fmt.Println(i)
    }
}

或通过通道传递整个数据集:

package main

import (
    "fmt"
)

func main() {
    collectInt := make(chan []int)
    go func() {
        var ints []int
        for i := 0; i < 10; i++ {
            ints = append(ints, i)
        }
        collectInt <- ints
    }()
    fmt.Println(<-collectInt)
}

在这种情况下,doneChan没有用。

答案 1 :(得分:1)

我可以逐步解释您的代码实际上做了什么:

  1. delare和malloc用于切片collectInt,它是空的。
  2. fmt.Println()空切片。
  3. 随机执行两个goroutine。第一个goroutine可能会失败,因为一旦第二个goroutine exec首先执行,主例程就会停止。

好的,您可能知道为什么第2步打印一个空切片