为什么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'之后