0

我有一个项目使用包标志来读取 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,如何删除其他设置?

4

1 回答 1

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是错误处理。有关更多详细信息,请参见此处

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

于 2018-04-19T07:34:00.977 回答