как вернуть значения в рутине - PullRequest
0 голосов
/ 09 октября 2019

У меня есть код:

    go s.addItemSync(ch, cs.ResponseQueue, user)

Это вызывает func:

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 { строке?

1 Ответ

3 голосов
/ 09 октября 2019

Если вы хотите подождать, пока процедура выполнения не будет завершена, вам нужно вернуть результаты в канале. Базовая схема, не усложняющая группы ожидания и т. Д.:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...