dopuzf0898 2019-02-20 18:14
浏览 325
已采纳

在golang中运行多个条件函数

I would like to run workflow functions using 5 functions in golang

  1. init
  2. validate
  3. process
  4. execute
  5. finalize

Each method should return the same result object and error object in case of failure

I would like to find a pattern to run this workflow rather than doing the following:

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 {

               }
           }
       }
    }
}

Thanks in advance Peter

  • 写回答

2条回答 默认 最新

  • dongyan0629 2019-02-20 21:29
    关注

    You can create a slice of functions and make this whole process prettier, e.g.

    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!")
    }
    

    In short, the break stops things from going on, if you wrap the above process as a function, you could also use something like

    return false
    

    in case of an error, and at the end of the total amount of iterations, say i == len(functions) -1, you could return true if everything went all right.

    It is noteworthy to mention that you can only create slice of functions that satisfies these conditions:

    • They all must have the same amount of arguments;

    • All arguments must have the same type per position;

    • They all have the same amount of return values;

    • Likewise, they (return values) must have the same type per position;

    Still, you can easily overcome these limitations by having two or three different slices. For example, function1 to function3 can all be classified as

    func () (bool, err)
    

    Where function4 and 5 are

    func () (int, err)
    

    For these functions to work you could just reiterate the first slice, then if everything goes as planned, move on to the second.

    firstSetOfFuncs := []func() (bool, error){
        function1, function2, function3,
    }
    secondSetOfFuncs := []func() (int, err){
        function4, function5,
    }
    for i, function := range firstSetOfFuncs {
        someValue, err := function()
        if err != nil {
            fmt.Println("Something went terribly wrong.")
            break
        }
        if i == len(firstSetOfFuncs) - 1 {
            for _, secondTypeOfFunc := range secondSetOfFuncs {
                someNum, anotherErr := secondTypeOfFunc()
                if anotherErr != nil {
                    fmt.Println("All seemed all right, until it didn't.")
                    break
                }
            }
        }
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 微信公众号如何开发网页
  • ¥15 h3.6m 人类行为预测论文复现
  • ¥50 wordpress项目注册报失败刷新后其实是成功状态,请求排查原因
  • ¥20 linxu服务器僵尸进程不释放,代码如何修改?
  • ¥15 pycharm激活不成功
  • ¥40 如果update 一个列名为参数的value
  • ¥15 基于51单片机的水位检测系统设计中LCD1602一直不显示
  • ¥15 OCS2安装出现问题,请大家给点意见
  • ¥15 ros小车启动launch文件报错
  • ¥15 vs2015到期想登陆但是登陆不上