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

我正在开发一个简单的命令行工具,但我发现默认的 Usage 消息有点缺乏。我想定义我自己的,我认为我做对了我指的是这个例子。


我注释掉了我编写的大部分代码,因此包含 main 函数的文件现在看起来像这样:


package main


import (

    "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 的。


我究竟做错了什么?


犯罪嫌疑人X
浏览 170回答 1
1回答

largeQ

编辑:实际上重新访问您的代码它有效!你用的是什么版本的Go?也许你需要重建你的代码。Usage调用哪个函数的决定在flag.go源文件中,第 708 行,未导出的函数usage()(来自 Go 1.4):func (f *FlagSet) usage() {&nbsp; &nbsp; if f.Usage == nil {&nbsp; &nbsp; &nbsp; &nbsp; if f == CommandLine {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Usage()&nbsp; &nbsp; &nbsp; &nbsp; } else {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; defaultUsage(f)&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; } else {&nbsp; &nbsp; &nbsp; &nbsp; f.Usage()&nbsp; &nbsp; }}这告诉如果FlagSet.Usage不是nil,它将被调用。如果没有为您调用它,很可能您使用的是 1.4 之前的 Go 版本(您在评论中确认了这一点)。但是由于您使用的是默认flag.CommandLine标志集,您可以简单地编写:// Note "flag.Usage" instead of "f.Usage"flag.Usage = func() {&nbsp; &nbsp; fmt.Println("foo bar")}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go