【发布时间】:2019-01-24 20:53:22
【问题描述】:
这是我的代码,我哪里出错了?
func main() {
intChan := make(chan int)
wg := sync.WaitGroup{}
for i := 0;i<5;i++{
wg.Add(1)
go send(intChan,i,&wg)
}
wg.Add(1)
go get(intChan,&wg)
wg.Wait()
time.Sleep(5*time.Second)
close(intChan)
}
func send(c chan int,index int,wg *sync.WaitGroup){
defer func() {
wg.Done()
}()
c <- index
}
func get(c chan int,wg *sync.WaitGroup){
defer func() {
wg.Done()
}()
for i := range c{
fmt.Printf("%d\n",i)
}
}
当我运行它时,我收到错误fatal error: all goroutines are asleep - deadlock!
这是错误信息:
goroutine 1 [semacquire]:
sync.runtime_Semacquire(0xc0000120d8)
C:/Go/src/runtime/sema.go:56 +0x40
sync.(*WaitGroup).Wait(0xc0000120d0)
C:/Go/src/sync/waitgroup.go:130 +0x6b
main.main()
F:/go/src/demo/channel.go:94 +0xf9
goroutine 10 [chan receive]:
main.get(0xc00001c120, 0xc0000120d0)
F:/go/src/demo/channel.go:112 +0xe0
created by main.main
F:/go/src/demo/channel.go:92 +0xeb
谢谢大家,这是我的第一个问题。
【问题讨论】:
-
get在通道关闭之前不会返回,并且您的主 goroutine 在get返回之前不会关闭通道(因为那是它执行wg.Done()的时间)。那是你的僵局。 -
你还可以在循环中捕获 i ,每次 send() 运行时,它的值可以是 0 到 4 之间的任何值。
-
忽略以上评论。发送的调用正确捕获了 i。
-
@AndySchweig 我该如何解决?我无法修复它。tks
标签: go