Если вы хотите подождать, пока процедура выполнения не будет завершена, вам нужно вернуть результаты в канале. Базовая схема, не усложняющая группы ожидания и т. Д.:
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 и записать журнал в случае ошибки, вы можете использовать анонимную функцию:
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