为了账号安全,请及时绑定邮箱和手机立即绑定

Golang 标志库:无法覆盖打印命令行使用情况的 Usage 函数

Golang 标志库:无法覆盖打印命令行使用情况的 Usage 函数

Go
犯罪嫌疑人X 2021-09-13 10:20:27
我正在开发一个简单的命令行工具,但我发现默认的 Usage 消息有点缺乏。我想定义我自己的,我认为我做对了我指的是这个例子。我注释掉了我编写的大部分代码,因此包含 main 函数的文件现在看起来像这样:package mainimport (    "flag"    "fmt"    "os")func main() {    // set the custom Usage function    setupFlags(flag.CommandLine)    // define flags...    // then parse flags    flag.Parse()    // custom code that uses flag values...}func setupFlags(f *flag.FlagSet) {    f.Usage = func() {        fmt.Println("foo bar")    }}看起来这应该有效,但事实并非如此。运行时,<binary> -h我收到默认使用消息,而不是我foo bar在自定义函数中定义的自定义消息。我在 OSX 上使用 Go 1.3.3 版。我找到了这个提交,但它是针对 Go 1.4rc2 的。我究竟做错了什么?
查看完整描述

1 回答

?
largeQ

TA贡献2039条经验 获得超7个赞

编辑:


实际上重新访问您的代码它有效!你用的是什么版本的Go?也许你需要重建你的代码。


Usage调用哪个函数的决定在flag.go源文件中,第 708 行,未导出的函数usage()(来自 Go 1.4):


func (f *FlagSet) usage() {

    if f.Usage == nil {

        if f == CommandLine {

            Usage()

        } else {

            defaultUsage(f)

        }

    } else {

        f.Usage()

    }

}

这告诉如果FlagSet.Usage不是nil,它将被调用。如果没有为您调用它,很可能您使用的是 1.4 之前的 Go 版本(您在评论中确认了这一点)。


但是由于您使用的是默认flag.CommandLine标志集,您可以简单地编写:


// Note "flag.Usage" instead of "f.Usage"


flag.Usage = func() {

    fmt.Println("foo bar")

}


查看完整回答
反对 回复 2021-09-13
  • 1 回答
  • 0 关注
  • 169 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信