在golang中运行多个条件函数

时间:2019-02-20 18:14:06

标签: go

我想使用golang中的5个功能来运行工作流程功能

  1. 初始化
  2. 验证
  3. 过程
  4. 执行
  5. 完成

如果失败,每个方法应返回相同的结果对象和错误对象

我想找到一种模式来运行此工作流程,而不是执行以下操作:

if result, err := init(); err != nil {
    if result, err := validate(); err != nil {
       if result, err := process(); err != nil {
           if result, err := execute(); err != nil {
               if result, err := finalize(); err != nil {

               }
           }
       }
    }
}

预先感谢 彼得

2 个答案:

答案 0 :(得分:1)

正如我在评论中已经说过的,我认为最idiomatic的方式是只调用一个方法,检查错误。如果有错误,请返回。 当然,您可以使用简化的错误处理版本,就像您在问题中使用的一样,但是即使这样做也可以。尽量避免使用深nesting。很难阅读和理解(深层的)嵌套代码。

result,err := init()
if err != nil {
  return nil, err // An error occured so handle it
}

result,err = validate()
if err != nil {
  return nil, err
}


result,err = process()
if err != nil {
  return nil, err
}


result,err = execute()
if err != nil {
  return nil, err
}

result,err = finalize()
if err != nil {
  return nil, err
}

示例代码的问题

您已完成错误检查错误。您正在检查

  

if err!= nil

说“如果有错误”。尽管有错误,但您继续执行代码。

要解决此问题,您需要编写:

var result someType

if result, err := init(); err != nil {
  return nil, err // An error occured so handle it
}

if result, err := validate(); err != nil {
  return nil, err
}


if result, err := process(); err != nil {
  return nil, err
}

if result, err := execute(); err != nil {
  return nil, err
}

if result, err := finalize(); err != nil {
  return nil, err
}

答案 1 :(得分:1)

您可以创建函数的一部分,并使整个过程更漂亮,例如

errno: 150 - Foreign key constraint is incorrectly formed

简而言之,该中断阻止了事情的继续,如果将上述过程包装为一个函数,还可以使用类似的

functions := []func() (string, error){
    function1, function2, function3, function4, function5,
}
for _, function := range functions {
    someValue, err := function()
    if err != nil {
        fmt.Println("Function " + someValue + " didn't feel so good.")
        break
    }
    fmt.Println("Function " + someValue + " went all right!")
}

如果出现错误,并且在总迭代次数结束时,例如i == len(functions)-1,如果一切正常,则可以返回true。

值得注意的是,您只能创建满足以下条件的函数片段:

  • 它们都必须具有相同数量的参数;

  • 所有参数的每个位置必须具有相同的类型;

  • 它们都具有相同数量的返回值;

  • 同样,它们(返回值)的每个位置必须具有相同的类型;

不过,您可以通过拥有两个或三个不同的片来轻松克服这些限制。例如,function1到function3都可以归类为

return false

函数4和5在哪里

func () (bool, err)

要使这些功能正常工作,您可以重复第一个片段,然后,如果一切按计划进行,请继续执行第二个片段。

func () (int, err)