1

我正在使用 goroutines 来快速执行。我正在为练习制作一个示例程序,但我想知道当我在 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 例程时如何将值分配给变量。

4

2 回答 2

3

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

围棋谚语

不要通过共享内存来通信,通过通信来共享内存。

要么创建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情况下没有用。

于 2019-01-31T07:32:26.910 回答
1

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

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

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

于 2019-01-31T09:29:21.783 回答