go - 如何在 goroutine 中返回值

标签 go

我有代码:

    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/

相关文章:

go - 我如何在 Golang 中获取用户的输入 (fmt.scan)

mongodb - UpdateOne、ReplaceOne、FindOneAndReplace - 模式匹配,但没有更新数据

Golang 与 React 路由器?

go - 如果 struct golang 中的值为 nil、0、false,则更新字段?

http - 在 Golang 中为 http.Response 使用空白标识符是否足以防止内存泄漏?

http - 设置 HTTP header

go - 如何为静态文件设置http header ?

golang windows服务包初始化设置

c - 从 Golang 中的 c 函数返回字符串

跨包的 golang 变量命名约定