Go语言cobra/viper框架如何判断子命令调用时是否主动传入flags
解决方案
Cobra 底层依赖的 pflag 库原生提供了判断 flag 是否被用户主动传入的能力,不需要比对默认值,也不需要依赖 Viper 实现:
1. 单个 flag 主动传参判断
使用 cmd.Flags().Changed(flagName) 方法,返回值为 true 即代表用户主动传入了该 flag,完全不受默认值影响:
var mysubcommandCmd = &cobra.Command{ Use: "mysubcommand", Args: cobra.ExactArgs(1), RunE: func(cmd *cobra.Command, args []string) error { viper.BindPFlags(cmd.Flags()) // 判断用户是否主动传入了 foobar flag if cmd.Flags().Changed("foobar") { // 匹配场景1:用户主动传入--foobar,无论传入值是否等于默认值都会命中 } else { // 匹配场景2:用户未传入该flag } return nil }, }
2. 批量获取所有用户主动传入的 flag
如果需要一次性处理所有用户主动设置的 flag,可以使用 cmd.Flags().Visit() 方法遍历,只有用户显式传入的 flag 才会进入回调逻辑:
cmd.Flags().Visit(func(f *pflag.Flag) { fmt.Printf("用户主动设置flag:%s,值为:%s\n", f.Name, f.Value.String()) })
注意事项
不要通过 Viper 判断参数来源,因为 Viper 会合并配置文件、环境变量、命令行参数等多个来源的配置,本身不提供区分配置来源的官方能力,判断命令行传参直接使用 Cobra 自带的 FlagSet 方法即可。
内容的提问来源于stack exchange,提问作者pkaramol
相关产品推荐
相关产品推荐

