Golang 标志库:无法覆盖打印出命令行用法的 Usage 函数
Golang flag library: Unable to override Usage function that prints out command line usage
我正在开发一个简单的命令行工具,但我发现默认的 Usage 消息有点欠缺。我想定义我自己的,我认为我做对了我指的是 this example.
我注释掉了我编写的大部分代码,因此包含主要功能的文件现在如下所示:
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")
}
我正在开发一个简单的命令行工具,但我发现默认的 Usage 消息有点欠缺。我想定义我自己的,我认为我做对了我指的是 this example.
我注释掉了我编写的大部分代码,因此包含主要功能的文件现在如下所示:
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")
}