Golang:无法将错误发送到 recover() 中的通道

Golang: Cannot send error to channel in recover()

我尝试在恢复时在频道中发送错误 为什么这个错误没有发送到频道?

package main

import (
    "fmt"
    "sync"
    "errors"
)

func main() {
    var wg sync.WaitGroup
    wg.Add(1)
    batchErrChan := make(chan error)
    
    go func(errchan chan error) {
       defer func() {
         if r := recover(); r != nil {
            errchan <- errors.New("recover err")
         }
         close(batchErrChan)
         wg.Done()
       }()

       panic("ddd")
    }(batchErrChan)

    go func() {
       for _ = range batchErrChan {
         fmt.Println("err in range")
       }
    }()
    
    wg.Wait()
}

https://play.golang.org/p/0ytunuYDWZU

我希望打印出“err in range”,但事实并非如此。为什么?

你的程序在 goroutine 有机会打印消息之前结束。尝试等待它:

        ...
        done:=make(chan struct{})
        go func() {
         for _ = range batchErrChan {
            fmt.Println("err in range")
         }
         close(done)
       }()
    
       wg.Wait()
       <-done
}