¿Cómo puedo analizar muy bien una lista de parámetros de programa y automatizar el manejo "--help" y/o "--version" (como "program [-d value] [--abc] [FILE1]
") en Go?comportamiento getopt-like en Go
Respuesta
Lo hice sólo para usted:
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])
}
}
}
ver también https://play.golang.org/p/XtNXG-DhLI
prueba:
$ ./8.out -help -version monkey business I need somebody Version Zero arg 3: monkey arg 4: business
Utilice el paquete 'flag': http://golang.org/pkg/flag/. Sin embargo, no hace argumentos dobles. No hay nada que imita exactamente el comportamiento getopt GNU (todavía).
De En la sección "Interfaz de usuario de línea de comando", tiene varias bibliotecas capaces de analizar getopt-long parameters.
lo intentaba, con un Go1.0.2:
- la code.google.com/p/opts-go (Ver its documentation), lo cual no es del todo operativa.
- github.com/droundy/goopt (Vea its documentation), que tiene un complete set of examples.
Ejemplo:
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
}
Otros parámetros por defecto proporcionados con 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
go-flags es muy completo, BSD licencia, y tiene una clara 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)
}
go-flags es bastante completo y también tiene la función de subcomando que yo quiero. Pero el documento es difícil de entender. Sugiero que leer código de ejemplo + hacer referencia a su documento sea lo mejor. (El enlace de ejemplo que señaló es muy útil.) –
Creo que lo que quieres es docopt. Te referiré to an earlier answer publiqué los detalles.
Google ha creado un paquete getopt (import "github.com/pborman/getopt"
) que proporciona el análisis de línea de comandos más estándar (frente al paquete 'bandera').
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!
Vaya, estaba equivocado. El paquete fue escrito por Google y Google posee los derechos de autor. – yegle
Otra opción es Kingping que proporciona soporte para todos los objetos valiosos estándar que han llegado a esperar de una línea de comandos de análisis moderno de la biblioteca. Tiene --help
en múltiples formatos, subcomandos, requisitos, tipos, valores predeterminados, etc. También está en desarrollo. Parece que las otras sugerencias aquí no han sido actualizadas por un tiempo.
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)
}
}
Y la salida --help
:
$ 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.
- 1. compilación condicional en Go
- 2. Biblioteca compartida en Go?
- 3. Fusionar mapas en Go
- 4. Computación en clúster en Go
- 5. Codificador/decodificador WebP en go
- 6. Generando Números Aleatorios en Go
- 7. haciendo algoritmos genéricos en go
- 8. ¿Cómo manejar i18n en Go?
- 9. Extracción de subcadenas en Go
- 10. Soporte WSDL/SOAP en Go?
- 11. Go, go get, go install, paquetes locales y control de versión
- 12. ¿Comportamiento extraño finalmente?
- 13. bibliotecas de C++ que implementan Go rutinas o Go canales?
- 14. Go-Scala-Go! ¿Cuáles son las principales diferencias?
- 15. Comportamiento interesante en "NOEXEC ON"
- 16. Unix FIFO in go?
- 17. Envolviendo FUSE desde Go
- 18. Variables globales con GO
- 19. Thoughtworks Go Alternativas
- 20. Sizeof struct in Go
- 21. Android API de Go
- 22. Ejemplos de plantillas Go
- 23. ¿Cómo regreso de func main en Go?
- 24. Trabajando con tipos de funciones en Go
- 25. Patrón de observador en lenguaje Go
- 26. Referencia a literales de cadenas en Go
- 27. Simular una conexión tcp en Go
- 28. ¿Cuándo vaciar un archivo en Go?
- 29. conversión de float32 a int en Go
- 30. ¿Cómo ejecutar mi código Go en Android?
hora de que alguien escribió uno. Ha estado fuera todo el día. –
@Kinopiko: Eche un vistazo a go-mode.el en el directorio misc/emacs del repositorio de código fuente. – richq
Aquí hay un enlace a un ejemplo que usa indicadores de línea de comandos: http: // golang.org/doc/go_tutorial.html # tmp_53 (El ejemplo "Echo" en el tutorial Go) –