代码之家  ›  专栏  ›  技术社区  ›  Roger Pate

Go中的getopt-like行为

go
  •  14
  • Roger Pate  · 技术社区  · 15 年前

    如何很好地解析程序参数列表并自动处理“-help”和/或“-version”(例如) program [-d value] [--abc] [FILE1] “)在Go中?

    7 回复  |  直到 7 年前
        1
  •  15
  •   Thomas Wouters    15 年前

    使用“flag”包: http://golang.org/pkg/flag/ . 但是,它不执行双破折号参数。没有任何东西可以完全模仿GNU的getopt行为。

        2
  •  14
  •   seriousdev    8 年前

    谷歌创造了一个 getopt 包装(包装) import "github.com/pborman/getopt" )它提供了更标准的命令行分析(与“flag”包相比)。

    package main
    
    import (
        "fmt"
        "os"
        "github.com/pborman/getopt"
    )
    
    func main() {
        optName := getopt.StringLong("name", 'n', "", "Your name")
        optHelp := getopt.BoolLong("help", 0, "Help")
        getopt.Parse()
    
        if *optHelp {
            getopt.Usage()
            os.Exit(0)
        }
    
        fmt.Println("Hello " + *optName + "!")
    }
    

    $ ./hello --help
    Usage: hello [--help] [-n value] [parameters ...]
         --help        Help
     -n, --name=value  Your name
    
    $ ./hello --name Bob
    Hello Bob!
    
        3
  •  10
  •   VonC    12 年前

    在“命令行用户界面”部分,有几个库可以解析 getopt-long parameters .

    我试过了,用go1.0.2:

    例子:

    package main
    
    import (
        "fmt"
        goopt "github.com/droundy/goopt"
    )
    
    func main() {
        fmt.Println("flag")
        goopt.NoArg([]string{"--abc"}, "abc param, no value", noabc)
    
        goopt.Description = func() string {
            return "Example program for using the goopt flag library."
        }
        goopt.Version = "1.0"
        goopt.Summary = "goopt demonstration program"
        goopt.Parse(nil)
    }
    
    func noabc() error {
        fmt.Println("You should have an --abc parameter")
        return nil
    }
    

    提供的其他默认参数 goopt 以下内容:

     --help               Display the generated help message (calls Help())
     --create-manpage     Display a manpage generated by the goopt library (uses Author, Suite, etc)
     --list-options       List all known flags
    
        4
  •  7
  •   HankB    7 年前

    我只是为你做的:

    package main
    
    import (
      "fmt";
      "os"
    )
    
    func main() {
      for i, arg := range os.Args {
        if arg == "-help" {
          fmt.Printf ("I need somebody\n")
        }else if arg == "-version" {
          fmt.Printf ("Version Zero\n")
        } else {
          fmt.Printf("arg %d: %s\n", i, os.Args[i])
        }
      }
    }
    

    也见 https://play.golang.org/p/XtNXG-DhLI

    测试:

    $ ./8.out -help -version monkey business
    I need somebody
    Version Zero
    arg 3: monkey
    arg 4: business
    
        5
  •  6
  •   jbtule    11 年前

    go-flags 非常完整,BSD许可,并且 example .

    var opts struct {
          DSomething string `short:"d" description:"Whatever this is" required:"true"`
          ABC bool `long:"abc" description:"Something"`
    }
    
    fileArgs, err := flags.Parse(&opts)
    
    if err != nil {
        os.Exit(1)
    }
    
        6
  •  5
  •   kichik    8 年前

    另一个选择是 Kingping 它为您期望从现代命令行解析库得到的所有标准产品提供支持。它有 --help 在多种格式、子命令、需求、类型、默认值等中,它仍在开发中。这里的其他建议似乎已经有一段时间没有更新了。

    package main
    
    import (
      "os"
      "strings"
      "gopkg.in/alecthomas/kingpin.v2"
    )
    
    var (
      app      = kingpin.New("chat", "A command-line chat application.")
      debug    = app.Flag("debug", "Enable debug mode.").Bool()
      serverIP = app.Flag("server", "Server address.").Default("127.0.0.1").IP()
    
      register     = app.Command("register", "Register a new user.")
      registerNick = register.Arg("nick", "Nickname for user.").Required().String()
      registerName = register.Arg("name", "Name of user.").Required().String()
    
      post        = app.Command("post", "Post a message to a channel.")
      postImage   = post.Flag("image", "Image to post.").File()
      postChannel = post.Arg("channel", "Channel to post to.").Required().String()
      postText    = post.Arg("text", "Text to post.").Strings()
    )
    
    func main() {
      switch kingpin.MustParse(app.Parse(os.Args[1:])) {
      // Register user
      case register.FullCommand():
        println(*registerNick)
    
      // Post message
      case post.FullCommand():
        if *postImage != nil {
        }
        text := strings.Join(*postText, " ")
        println("Post:", text)
      }
    }
    

    以及 --帮助 输出:

    $ chat --help
    usage: chat [<flags>] <command> [<flags>] [<args> ...]
    
    A command-line chat application.
    
    Flags:
      --help              Show help.
      --debug             Enable debug mode.
      --server=127.0.0.1  Server address.
    
    Commands:
      help [<command>]
        Show help for a command.
    
      register <nick> <name>
        Register a new user.
    
      post [<flags>] <channel> [<text>]
        Post a message to a channel.
    
        7
  •  2
  •   Community Mr_and_Mrs_D    7 年前

    我想你想要的是多科特。我给你介绍一下 to an earlier answer 我张贴了详细信息。