例程在传递数据时挂起



给定以下变量

wg.Add(4)
pDayResCh := make(chan map[string]map[string]int)
pDayErrCh := make(chan error)

下面的代码挂起

// Convert the previous, current, and next day prayers and put them in map
go func() {
fmt.Println("executing first go routine") // TODO: Remove this line after debug
data, err := dayPrayerMapConv(previousDayPrayers)
fmt.Printf("first goroutine result %vn", data) // TODO: Remove this line after debug
if err != nil {
fmt.Printf("first goroutine err != nil %vn", err)
pDayErrCh <- err
}
fmt.Printf("first goroutine putting data into channel")
pDayResCh <- data
fmt.Printf("first go routine finished") // TODO: Remove this line after debug
wg.Done()
}()
pDayErr := <-pDayErrCh
close(pDayErrCh)
if pDayErr != nil {
return pDayErr
}
fmt.Println("pday err finised")
p.PreviousDayPrayers = <-pDayResCh
close(pDayResCh)

这是打印语句

的结果
first goroutine result map[Asr:map[Hour:3 Minute:28] Dhuhr:map[Hour:12 Minute:23] Fajr:map[Hour:5 Minute:32] Isha:map[Hour:7 Minute:5] Maghrib:map[Hour:6 Minute:13]]
first goroutine putting data into channel

所以在data变量中有数据应该被传递到pDayResCh,但它似乎卡在那里,为什么?

由于我的例程中检查错误的条件

if err != nil {
fmt.Printf("first goroutine err != nil %vn", err)
pDayErrCh <- err
}

由于error为nil,该数据永远不会被传递到通道中,因此挂起

去掉条件并传递err,问题就解决了。

最新更新