我有代码:
go s.addItemSync(ch, cs.ResponseQueue, user)
这调用了函数:
func (s *Services) addItemSync(ch types.ChannelInsertion, statusQueueName, user string) {
//func body here
}
但是,我想这样做:
if ok, err := go s.addItemSync(ch, cs.ResponseQueue, user); !ok {
if err != nil {
log.Log.Error("Error adding channel", zap.Error(err))
return
}
这会将其他功能更改为此
func (s *Services) addItemSync(ch types.ChannelInsertion, statusQueueName, user string) (bool, error) {
}
如,我希望能够声明
go func
但这每次都会出错。知道如何在能够调用 go func
的同时声明变量同步调用的能力?如 if ok, err := go s.addItemSync(ch, cs.ResponseQueue, user); !ok {
中所见线?
最佳答案
如果您想等到 go-routine 完成,您需要在 channel 中返回结果。基本模式(不涉及 WaitGroup 等)是:
func myFunc() {
// make a channel to receive errors
errChan := make(chan error)
// launch a go routine
go doSomething(myVar, errChan)
// block until something received on the error channel
if err := <- errChan; err != nil {
// something bad happened
}
}
// your async funciton
func doSomething(myVar interface{}, errChan chan error) {
// Do stuff
if something, err := someOtherFunc(myVar); err != nil {
errChan <- err
return
}
// all good - send nil to the error channel
errChan <- nil
}
在您的情况下,如果您只想启动一个 go-routine 并记录是否发生错误,您可以使用匿名函数:
go func() {
if ok, err := s.addItemSync(ch, cs.ResponseQueue, user); !ok {
if err != nil {
log.Log.Error("Error adding channel", zap.Error(err))
}
}
}()
或者,如果您想等待结果:
errChan := make(chan error)
go func() {
if ok, err := s.addItemSync(ch, cs.ResponseQueue, user); !ok {
if err != nil {
errChan <- err
return
}
}
errChan <- nil
}()
// do some other stuff while we wait...
// block until go routine returns
if err := <- errChan; err != nil {
log.Log.Error("Error adding channel", zap.Error(err))
}
注:
您编写的代码可能会产生意想不到的结果,如果响应可能是
ok == false
不会返回错误。如果这是一个问题,我建议为 !ok && err == nil
的情况创建并返回一个新错误。
关于go - 如何在 goroutine 中返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58306649/