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

Abh*_*ock 2 dictionary if-statement go

我在多层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.")
}
Run Code Online (Sandbox Code Playgroud)

icz*_*cza 6

对于您所拥有的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)
}
Run Code Online (Sandbox Code Playgroud)

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

另一个解决方案可能是使用反射来调用方法,但是同样,处理不同的参数将很不方便。反射速度也较慢,更不用说您必须避免不允许不打算公开的调用方法。有关示例,请参见使用特殊前缀/后缀调用函数