我正在开发一个需要initFunction
在单独的 goroutine 中调用启动函数 ( ) 的 Go 项目(以确保此函数不会干扰项目的其余部分)。initFunction
不得超过 30 秒,所以我想我会使用 context.WithTimeout。最后,initFunction
必须能够将错误通知给调用者,所以我想到了创建一个错误通道并从匿名函数中调用 initFunction 来接收并报告错误。
func RunInitGoRoutine(initFunction func(config string)error) error {
initErr := make(chan error)
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Seconds)
go func() {
<-ctx.Done() // Line 7
err := initFunction(config)
initErr <-err
}()
select {
case res := <-initErr:
return res.err
case <-ctx.Done():
err := errors.New("Deadline")
return err
}
}
我对 Go 很陌生,所以我要求对上述代码提供反馈。
- 我对第 7 行有一些疑问。我用它来确保匿名函数被“包含”在下面
ctx
,因此被杀死和释放,一旦超时到期,一切都将结束,但我不确定我是否做了正确的事情。 - 第二件事是,我知道我应该打电话给
cancel( )
某个地方,但我无法确定在哪里。 - 最后,真的欢迎任何反馈,无论是关于效率、风格、正确性或任何其他方面。