为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
Qyouu 2023-07-10 14:33:00
我对多层 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.")}
查看完整描述

2 回答

?
手掌心

TA贡献1942条经验 获得超3个赞

对于你所拥有的来说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)

}

使用映射会很不方便,因为并非所有方法都具有相同的签名,但您可以使用多个映射。

另一种解决方案可能是使用反射来调用方法,但同样,处理不同的参数会很不方便。反射也比较慢,更不用说您必须注意不允许调用不打算公开的方法。


查看完整回答
反对 回复 2023-07-10
?
莫回无

TA贡献1865条经验 获得超7个赞

可以将您所拥有的内容表达为地图。这里的基本设置是,无论你走哪条路,你都会得到一些可以不带参数调用的函数,并且它总是返回相同的类型()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 的答案中的形式更加惯用。


查看完整回答
反对 回复 2023-07-10
  • 2 回答
  • 0 关注
  • 105 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信