Go语言 如何从承诺内部返回错误?

6kkfgxo0  于 2023-01-28  发布在  Go
关注(0)|答案(2)|浏览(116)

我有一个函数(sendAll),如果kgo.Producedocs here)出错了,我想让它返回error。我怎样才能让它停止循环并返回错误呢?

func (k *buffer) sendAll() error {
    for _, record := range k.buffer {
        kgo.Produce(ctx, &record, func(r *kgo.Record, err error) {
            if err != nil {
                fmt.Printf("record had a produce error: %v\n", err)
                
                // How do I return an error here and exit sendAll function?
                
            }
        })
    }
    return nil
}
rkttyhzu

rkttyhzu1#

在我看来,您可以通过对“局部”变量进行简单的检查来逃避责任。

func (k *buffer) sendAll() error {

    var loop error

    for _, record := range k.buffer {
        if loop != nil {
            break
        }
        kgo.Produce(ctx, &record, func(r *kgo.Record, err error) {
           
            if err != nil {
                fmt.Printf("record had a produce error: %v\n", err)
                
                // How do I return an error here and exit sendAll function?
                loop = err
            }
        })
    }
    return loop
}
jdgnovmf

jdgnovmf2#

正确的方法是在循环中返回错误。

import "fmt"

func exitForLoopWithError(err error) error {
  for i := 0; i < 10; i++ {
    if err != nil {
      return err
    }
  }
return nil
}

func main() {
  err := fmt.Errorf("An error occurred")
  returnedErr := exitForLoopWithError(err)
  if returnedErr != nil {
    fmt.Println(returnedErr)
  }
}

相关问题