我正在使用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例程时如何将值分配给变量。
答案 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)
我可以逐步解释您的代码实际上做了什么:
collectInt
,它是空的。好的,您可能知道为什么第2步打印一个空切片