我正在使用一个简单的命令行工具,我发现默认的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。
我做错了什么?
答案 0 :(得分:7)
修改强>
实际上重新审视你的代码是有效的!您使用的是什么版本的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")
}