为什么在go例程中为变量赋值后变量将为空?

为什么在go例程中为变量赋值后变量将为空?,go,routines,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++ { coll

我正在使用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
}
播放链接


请告诉我如何在使用go例程时为变量赋值。

规则不是与共享变量共享数据,而是在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在这种情况下没有用处。

规则不是与共享变量共享数据,而是在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在这种情况下没有用处。

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

delare和malloc对于切片collectInt,它是空的。 fmt.在空片中打印。 随机执行两个goroutine。第一个goroutine可能会失败,因为一旦第二个goroutine exec first,主例程就会停止。
好的,您可能知道为什么第2步打印一个空切片,我可以一步一步地解释您的代码实际上做了什么:

delare和malloc对于切片collectInt,它是空的。 fmt.在空片中打印。 随机执行两个goroutine。第一个goroutine可能会失败,因为一旦第二个goroutine exec first,主例程就会停止。
好的,您可能知道为什么第2步在go例程中分配变量empty后打印空切片

值,而在分配collectInt后不打印它。您在某个goroutine(最终将分配给它)被调度但不一定执行后打印它!还要注意,goroutines不是一个快速按钮。即使所有错误都已修复,如果在go例程中赋值后变量的main.value为空,则在赋值后不打印collectInt,则此程序可能会更快。您在某个goroutine(最终将分配给它)被调度但不一定执行后打印它!还要注意,goroutines不是一个快速按钮。即使所有的错误都已修复,如果一切都发生在main中,该程序可能会更快。