为什么我需要一个goroutine才能工作?
我不是100%清楚为什么我的代码不起作用为什么我需要一个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
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
是按顺序运行的,这意味着在所有发送完成之前,没有任何接收开始。正如其他人所指出的,问题现在很明显发送方只能在接收方接收时发送。