我想使用golang中的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 {
}
}
}
}
}
预先感谢 彼得
答案 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)