如何仅在go-flag包中显示当前设置?

时间:2018-04-19 06:40:29

标签: go go-flag

我有一个使用包flag来读取argv(参数)的项目,它会在没有给出参数的情况下打印默认设置:

func initFlag() {
    path := flag.String("F", "store_server.conf", "config file path")
    v := flag.Bool("V", false, "print version")
    flag.Parse()

    if flag.NFlag() == 0 {
        flag.PrintDefaults()
        os.Exit(0)
    }

    fmt.Println(*path, *v)
}

func main() {
    initFlag() // initialize flag and load configure file

    select{}
}

执行结果如下:

vinllen@ ~$ go run main.go
  -F string
        config file path (default "store_server.conf")
  -V    print version

但是当我的代码包含glog等其他包时,PrintDefaults函数会显示更多设置,包括glog标记:

  -F string
        config file path (default "store_server.conf")
  -V    print version
  -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
  -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

我需要的唯一两个设置是-F-V,如何删除其他设置?

1 个答案:

答案 0 :(得分:1)

您需要使用新的FlagSet而不是默认值:

package main

import (
    "flag"
    "github.com/golang/glog"
    "os"
)

func initFlag() {
    flags := flag.NewFlagSet("myFlagSet", 0)
    path := flags.String("F", "store_server.conf", "config file path")
    v := flags.Bool("V", false, "print version")
    flags.Parse(os.Args[1:])

    if flags.NFlag() == 0 {
        if len(os.Args) == 0 {
            flags.PrintDefaults()
            os.Exit(0)
        }
    }

    glog.Info(*path, *v)
}

func main() {
    initFlag() // initialize flag and load configure file
    select {}
}

NewFlagSet的第二个参数是错误处理。有关详细信息,请参阅here

当您直接呼叫flag.someMethod()时,它会使用默认的共享标记集。如果你创建一个新的,它将是空的。