首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通用函数中的Golang Cobra命令标志不能从cli获取值

通用函数中的Golang Cobra命令标志不能从cli获取值
EN

Stack Overflow用户
提问于 2019-10-24 22:16:12
回答 3查看 2.5K关注 0票数 0

我将眼镜蛇命令flags移动到一个函数中,这样我就可以在其他命令中使用它。我可以看到这些命令,但是当我输入flage时,它总是返回false

以下是我的代码:

代码语言:javascript
复制
func NewCommand(ctx context.Context) *cobra.Command {
    var opts ListOptions

    cmd := &cobra.Command{
        Use:   "list",
        Short: "List",
        RunE: func(cmd *cobra.Command, args []string) error {
            fmt.Println(args) // []
            opts.refs = args
            return List(ctx, gh, opts, os.Stdout)
        },
    }

    cmd = GetCommandFlags(cmd, opts)
    return cmd
}

// GetListCommandFlags for list
func GetCommandFlags(cmd *cobra.Command, opts ListOptions) *cobra.Command {
    flags := cmd.Flags()
    flags.BoolVar(&opts.IgnoreLatest, "ignore-latest", false, "Do not display latest")
    flags.BoolVar(&opts.IgnoreOld, "ignore-old", false, "Do not display old data")
    return cmd
}

因此,当我键入以下命令时

代码语言:javascript
复制
data-check list --ignore-latest

--ignore-latest的标志值应该是true,但我得到的是false作为RunE参数中的一个值。我是不是漏掉了什么?

GetCommandFlags是我想在其他命令中使用的东西,我不想重复相同的标志。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-10-24 22:44:41

你应该像cmd = GetCommandFlags(cmd, &opts)一样使用func GetCommandFlags(cmd *cobra.Command, opts *ListOptions)并调用这个函数。

您可以输出opts.IgnoreLatestopts.IgnoreOld来查看更改后的值。

对我来说很好。希望它也能为你工作。

代码语言:javascript
复制
func NewCommand(ctx context.Context) *cobra.Command {
    var opts ListOptions

    cmd := &cobra.Command{
        Use:   "list",
        Short: "List",
        RunE: func(cmd *cobra.Command, args []string) error {
            // fmt.Println(args) // []
            fmt.Println(opts.IgnoreLatest, ", ", opts.IgnoreOld)
            opts.refs = args
            return List(ctx, gh, opts, os.Stdout)
        },
    }

    cmd = GetCommandFlags(cmd, &opts)
    return cmd
}

// GetListCommandFlags for list
func GetCommandFlags(cmd *cobra.Command, opts *ListOptions) *cobra.Command {
    flags := cmd.Flags()
    flags.BoolVar(&opts.IgnoreLatest, "ignore-latest", false, "Do not display latest")
    flags.BoolVar(&opts.IgnoreOld, "ignore-old", false, "Do not display old data")
    return cmd
}
票数 2
EN

Stack Overflow用户

发布于 2019-10-24 22:25:47

您正在按值将opts传递给GetCommandFlags。您应该向它传递一个指针,以便为标志注册的地址使用在调用函数中声明的opts

代码语言:javascript
复制
func GetCommandFlags(cmd *cobra.Command, opts *ListOptions) *cobra.Command {
  ...
}
票数 2
EN

Stack Overflow用户

发布于 2019-10-24 22:26:09

您传递的是值参数,而不是指针参数。

试着这样做:

代码语言:javascript
复制
cmd = GetCommandFlags(cmd, &opts, "")
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58543328

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档