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

我注释掉了我编写的大部分代码,因此包含 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 版。我找到了 this commit 但它适用于 Go 1.4rc2。

我究竟做错了什么?

最佳答案

编辑:

实际上重新访问您的代码它有效!你用的是什么版本的Go?也许你需要重建你的代码。
Usage 函数调用的决定在 flag.go 源文件 line 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")
}

关于Golang 标志库 : Unable to override Usage function that prints out command line usage,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28091963/

10-12 05:46