如何用地图替换多个“if-else-if”

我对多层 if-else-if 条件感到担忧,所以我想通过使用地图来简短说明。


请参阅 if-else-if 中的以下代码,我想用地图替换它。


function, args := APIstub.GetFunctionAndParameters()


if function == "queryProduce" {

    return s.queryProduce(APIstub, args)

} else if function == "initLedger" {

    return s.initLedger(APIstub)

} else if function == "createProduce" {

    return s.createProduce(APIstub, args)

} else if function == "queryAllProduces" {

    return s.queryAllProduces(APIstub)

} else if function == "changeProduceStatus" {

    return s.changeProduceStatus(APIstub, args)

}


return shim.Error("Invalid Smart Contract function name.")

}


Qyouu
浏览 106回答 2
2回答

手掌心

对于你所拥有的来说switch会很好:switch function {case "queryProduce":    return s.queryProduce(APIstub, args)case "initLedger":    return s.initLedger(APIstub)case "createProduce":    return s.createProduce(APIstub, args)case "queryAllProduces":    return s.queryAllProduces(APIstub)case "changeProduceStatus":    return s.changeProduceStatus(APIstub, args)}使用映射会很不方便,因为并非所有方法都具有相同的签名,但您可以使用多个映射。另一种解决方案可能是使用反射来调用方法,但同样,处理不同的参数会很不方便。反射也比较慢,更不用说您必须注意不允许调用不打算公开的方法。

莫回无

可以将您所拥有的内容表达为地图。这里的基本设置是,无论你走哪条路,你都会得到一些可以不带参数调用的函数,并且它总是返回相同的类型()error。我可能会明确地传递args进来。其高级结构是具有函数名称到函数的映射,然后调用所选函数。funcMap := map[string]func([]string) error{...}funcName, args := APIstub.GetFunctionAndParameters()f := funcMap[funcName]if f == nil {    f = func(_ []string) error {        return shim.Error("Invalid Smart Contract function name.")    }}return f(args)映射语法变得有点冗长funcMap := map[string]func([]string) error{    "queryProduce": func(args []string) error {        return s.queryProduce(APIstub, args)    },    "initLedger": func(_ []string) error {        return s.initLedger(APIstub)    },}如果您要在多个地方调用它,或者您想要一个单独的验证步骤,如果使用的话将定义一些名称,或者如果函数的实际列表是动态的(您可以添加或删除东西),那么映射方法会更好来自运行时的地图)。initLedger不一致的方法签名确实会带来复杂性,并且使所有内容保持一致会有所帮助(即使函数未使用,也可以采用参数列表之类的函数)。在普通代码中,我希望switch@icza 的答案中的形式更加惯用。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go