为什么goroutine频道会这样做?
我是刚来戈朗的。我试图理解频道是如何工作的,但这确实令人困惑 我评论了我的问题。有人能给我解释一下为什么这个代码的行为如此奇怪吗为什么goroutine频道会这样做?,go,channel,goroutine,Go,Channel,Goroutine,我是刚来戈朗的。我试图理解频道是如何工作的,但这确实令人困惑 我评论了我的问题。有人能给我解释一下为什么这个代码的行为如此奇怪吗 package main import "fmt" func main() { slice := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14} c := make(chan int) go pokeVals(slice, c) fmt.Println(slice)
package main
import "fmt"
func main() {
slice := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14}
c := make(chan int)
go pokeVals(slice, c)
fmt.Println(slice)
fmt.Println("start")
<-c // why 2 "poke"s here?
fmt.Println("-")
<-c // why 0 "poke"s?
//<-c // But if uncommented - 2 more "pokes" here
fmt.Println("end")
}
func pokeVals(values []int, c chan int) {
for _, val := range values {
fmt.Println("poke")
c <- val
}
fmt.Println("overpoked")
}
主程序包
输入“fmt”
func main(){
切片:=[]int{1,2,3,4,5,6,7,8,9,10,11,12,13,14}
c:=制造(成交量)
go pokeVals(切片,c)
fmt.Println(切片)
fmt.Println(“开始”)
Goroutines是并发运行的。它们的调度方式不在您的掌握之中,您唯一能保证的是,如果您使用同步,例如通道、等待组或其他同步原语
从main()
启动一个goroutine,它以循环方式在c
上发送值。但在发送每个值之前,它首先打印“poke”
。因此您可能会看到一个“poke”
即使您没有从c
接收,也会打印。如果您确实从c
接收到一个值,则此goroutine中的循环可以继续进行下一次迭代,再次打印“poke”
,甚至在main()
goroutine开始打印“-”之前,它可能会立即打印
。这就是您的体验
原始版本中的main()
goroutine(第三个goroutine)同时运行。它们的调度方式不在您的掌握之中,唯一的保证是如果您使用同步,如通道、等待组或其他同步原语
从main()
启动一个goroutine,它以循环方式在c
上发送值。但在发送每个值之前,它首先打印“poke”
。因此您可能会看到一个“poke”
即使您没有从c
接收,也会打印。如果您确实从c
接收到一个值,则此goroutine中的循环可以继续进行下一次迭代,再次打印“poke”
,甚至在main()
goroutine开始打印“-”之前,它可能会立即打印
。这就是您的体验
原始版本中的main()就在'c'之后