该解决方案的设计非常糟糕……您不知道评估这些标志的顺序。
问题
我假设您正在使用cobra
. 因此,当您阅读文档时,您将找不到任何有关如何评估标志的部分。所以有时它被称为未定义的行为,它可能会起作用,但如果将来它可能会改变
让我们分析一下您的示例:
deleteCmd.Flags().StringVarP(&option, "wallet", "w", "", "Specify the wallet to be deleted")
deleteCmd.Flags().StringVarP(&option, "holding", "o", "", "Specify the holding to be deleted")
deleteCmd.Flags().StringVarP(&option, "ticker", "t", "", "Specify the ticker to be deleted")
deleteCmd.Flags().StringVarP(&option, "tag", "g", "", "Specify the tag to be deleted")
您有以下标志:wallet, holding, ticker, tag
. 我们可以假设顺序是您将其放入代码中的方式。让我们说潜在的行为:
用户放置ticker
标志。所有标志的默认值为空。所以option
变量有一个空值,它来自tag
标志。
解决方案
您应该为每个标志使用单独的变量。并且您应该实现您的逻辑以覆盖确定已放置哪个标志的部分。
deleteCmd.Flags().StringVarP(&wallet, "wallet", "w", "", "Specify the wallet to be deleted")
deleteCmd.Flags().StringVarP(&holding, "holding", "o", "", "Specify the holding to be deleted")
deleteCmd.Flags().StringVarP(&ticker, "ticker", "t", "", "Specify the ticker to be deleted")
deleteCmd.Flags().StringVarP(&tag, "tag", "g", "", "Specify the tag to be deleted")
if wallet != "" {
option = wallet
selected = "wallet"
} else if holding != "" {
option = holding
selected = "holding"
} else ...
...
...