如何丢弃我的应用程序

时间:2018-03-09 05:07:32

标签: go command-line flags

考虑一下,我的应用程序使用第三方库。我希望我的应用程序只接受我的应用程序中定义的标志,而不是导入的包中定义的标志。

package main

import (
    "flag"
    "fmt"
    log "github.com/golang/glog"
)

var myFlag int

func init() {
    flag.IntVar(&myFlag, "my_flag", 0, "need only my flags")
    confDir := "/Users/foo/test/logs" //assume this is read from configuration file
    flag.Set("log_dir", confDir)
    flag.Parse()
}

func main() {
    flag.Parse()
    log.Errorln("flag", myFlag)
    log.V(0).Infoln("flag", myFlag)
    fmt.Println("test", myFlag)
}

在上面的代码示例中,log包有许多标志。在执行以下命令时编译后,将显示包括“my_flag”和日志包中的标志的所有标志。但是,我想从我的代码中使用从配置文件中获取的值设置日志包标志的值。

  -alsologtostderr
        log to standard error as well as files
  -log_backtrace_at value
        when logging hits line file:N, emit a stack trace
  -log_dir string
        If non-empty, write log files in this directory
  -logtostderr
        log to standard error instead of files
  -my_flag int
        need only my flags
  -stderrthreshold value
        logs at or above this threshold go to stderr
  -v value
        log level for V logs
  -vmodule value
        comma-separated list of pattern=N settings for file-filtered logging

如何限制我的应用程序可执行文件接受其他标志?

2 个答案:

答案 0 :(得分:2)

如果要丢弃其他包的标志,则可以使用新的标志集而不是默认标志集。

package main

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

var myFlag int

func main() {
    f := flag.NewFlagSet(os.Args[0], flag.ExitOnError)
    f.IntVar(&myFlag, "my_flag", 0, "need only my flags")
    confDir := "/Users/foo/test/logs" //assume this is read from configuration file
    f.Set("log_dir", confDir)
    f.Parse(os.Args[1:])
    fmt.Println("test", myFlag)
}

答案 1 :(得分:1)

flag非方法的函数使用导出的包变量CommandLine。你可以用

flag.CommandLine = flag.NewFlagSet(os.Args[0], flag.ExitOnError)

重置CommandLine中导出的包变量flag。这是一个可运行的例子:

package main

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

func main() {
    flag.Int("u", 1, "We don't want this flag")
    flag.CommandLine = flag.NewFlagSet(os.Args[0], flag.ExitOnError)
    GoodInt := flag.Int("g", 100, "This is a flag we want!")
    flag.Parse()
    fmt.Println(*GoodInt)
}

用法示例:

$ go run program.go -h
Usage of /tmp/.../program:
  -g int
    This is a flag we want! (default 100)
exit status 2

如果您希望避免修改包变量,可以通过创建一个新的FlagSet来实现,我的答案就在我面前。在这种情况下,请确保只调用新FlagSet上的方法,并避免使用flag上运行的CommandLine函数。