亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何用地圖替換多個“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 關注
  • 150 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號