go - 如何使用 Go 的标志包打印位置参数的用法?

标签 go

鉴于这个简单的 Go 程序只需要一个命令行参数,我该如何改进它以便 flag.Usage() 提供有用的输出?

package main

import (
    "flag"
    "fmt"
    "os"
)

func main() {
    flag.Parse()
    if len(flag.Args()) == 0 { 
        flag.Usage()
        os.Exit(1)
    }

    args := flag.Args()
    fmt.Println(args[0])
}

没有给定参数的当前输出:

$ ./args
Usage of ./args:

(即 usage 是空的,因为我找不到告诉 usage() 函数需要哪些参数的方法)。

我可以删除 flag.Usage() 并将其替换为如下内容:

fmt.Fprintln(os.Stderr, "Usage:", os.Args[0], "<argument>")

但是,如果已经有了使用 flag.Usage() 的好方法,我不想重新发明轮子。特别是因为它已经在处理可选参数:

$ ./args -foo
flag provided but not defined: -foo
Usage of ./args:

最佳答案

flag.Usage() 只会为您提供有关已定义标志的有用信息。因此,您可以通过 var foo = flag.Int(...) 将参数定义为标志。

另一种选择是定义您自己的使用处理程序。请参阅下面的简单示例,该示例将打印自定义消息和所有已定义标志的默认值。这样您自定义的 Usage 将被打印以防 flag.Parse() 失败。

package main
import (
    "flag"
    "fmt"
    "os"
)

func myUsage() {
     fmt.Printf("Usage: %s [OPTIONS] argument ...\n", os.Args[0])
     flag.PrintDefaults()
}

func main() {
     flag.Usage = myUsage
     /* ... */
}

关于go - 如何使用 Go 的标志包打印位置参数的用法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31873183/

相关文章:

go - 如何确定程序是在 Go 中构建为 32 位还是 64 位?

json - 使用自定义 MarshalJSON 更改结构中的 JSON 标签

go - strings.Split() 似乎在 [] 处逃脱并继续前进(没有错误)

amazon-web-services - 部署到 Elastic Beanstalk 时如何安装 Go 依赖项?

performance - Go按位运算性能之谜

arrays - 在模板文件中创建数组和循环的最佳方法是什么

node.js - 如何从 Node 中正确终止 Go 进程

滑行错误 "The system cannot find the path specified"

performance - 为什么这个程序在使用 goroutines 时表现不佳?

xml - 不能通过golang修改xml节点值?