如何在 goroutine 中返回值

Jay*_*266 0 go

我有代码:

    go s.addItemSync(ch, cs.ResponseQueue, user)
Run Code Online (Sandbox Code Playgroud)

这调用了该函数:

func (s *Services) addItemSync(ch types.ChannelInsertion, statusQueueName, user string) {
   //func body here
}
Run Code Online (Sandbox Code Playgroud)

不过我想这样做:

if ok, err := go s.addItemSync(ch, cs.ResponseQueue, user); !ok {
    if err != nil {
        log.Log.Error("Error adding channel", zap.Error(err))
        return
}
Run Code Online (Sandbox Code Playgroud)

这会将其他功能更改为此

func (s *Services) addItemSync(ch types.ChannelInsertion, statusQueueName, user string) (bool, error) {

}
Run Code Online (Sandbox Code Playgroud)

例如,我希望能够声明 ago func但每次都会出错。知道如何在声明变量的同时能够调用go func同步调用的功能吗?正如 if ok, err := go s.addItemSync(ch, cs.ResponseQueue, user); !ok {行中所见?

Pas*_*Kit 5

如果您想等到 go-routine 完成,您需要在通道中返回结果。基本模式(不与等待组等复杂化)是:

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

}
Run Code Online (Sandbox Code Playgroud)

在您的情况下,如果您只想启动 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))
        }
    }
}()
Run Code Online (Sandbox Code Playgroud)

或者如果您想等待结果:

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))
}
Run Code Online (Sandbox Code Playgroud)

注意: 如果响应可能ok == false不会返回错误,那么您编写的代码可能会产生意外结果。如果这是一个问题,我建议在以下情况下创建并返回一个新错误:!ok && err == nil