Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么我需要一个goroutine才能工作?_Go - Fatal编程技术网

为什么我需要一个goroutine才能工作?

为什么我需要一个goroutine才能工作?,go,Go,我不是100%清楚为什么我的代码不起作用 package main import ( "fmt" "sync" ) //var wg sync.WaitGroup func main() { c := make(chan int) send(c) receive(c) } func send(c chan<- int) { var wg sync.WaitGroup for

我不是100%清楚为什么我的代码不起作用

package main
 
import (
    "fmt"
    "sync"
)
 
//var wg sync.WaitGroup
 
func main() {
 
    c := make(chan int)
    send(c)
    receive(c)
}
 
func send(c chan<- int) {
    var wg sync.WaitGroup
    for i := 0; i < 10; i++ {
        wg.Add(1)
        go func() {
            for j := 0; j < 10; j++ {
                c <- j
            }
            wg.Done()
        }()
    }
 
    wg.Wait()
    close(c)
}
 
func receive(c <-chan int) {
    for v := range c {
        fmt.Println(v)
    }
}
主程序包
进口(
“fmt”
“同步”
)
//var wg sync.WaitGroup
func main(){
c:=制造(成交量)
发送(c)
接收(c)
}

func发送(c)通道未被缓冲。只有在另一个goroutine中有来自该通道的读取时,对未缓冲通道的写入才会完成。因此,在
send
中创建的所有goroutine都被卡在等待写入通道中,永远不会到达
wg.Done
,因此,
wg.Wait
会无限期地等待。当您放置在一个单独的goroutine中,
send
receive
可以运行,从而从通道中读取,释放等待的goroutine。

通道没有缓冲。只有在另一个goroutine中从该通道读取数据时,对无缓冲通道的写入才会完成。因此,在
send
中创建的所有goroutine都是一直在等待写入通道,从未到达
wg.Done
,因此,
wg.Wait
会无限期地等待。当您将
send
放在单独的goroutine中时,
receive
可以运行,从而从通道读取,释放等待的goroutine

“我认为在发送中等待意味着程序将在那里等待,直到在该函数中创建的go例程完成,并且只有在它们全部完成后才会转到接收函数"-正确,但在某些内容接收到这些值之前,它们无法完成,因此您有一个鸡和蛋的问题。这里有一种方法来看待它:
send
receive
是按顺序运行的,这意味着在所有发送完成之前,没有任何接收开始。正如其他人所指出的,问题现在很明显发送方只能在接收方接收时发送。“我认为在发送中进行等待意味着程序将在那里等待,直到在该函数中创建的go例程完成,并且只有在它们全部完成后才会转到接收函数。”-正确,但在某些内容接收到这些值之前,它们无法完成,因此您有一个鸡和蛋的问题。这里有一种方法来看待它:
send
receive
是按顺序运行的,这意味着在所有发送完成之前,没有任何接收开始。正如其他人所指出的,问题现在很明显发送方只能在接收方接收时发送。