为什么在go例程中为变量赋值后变量将为空?
我正在使用go例程来快速执行。我正在制作一个用于实践的示例程序,但当我在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
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中,该程序可能会更快。