2017-01-11 53 views
1

我知道我可以這樣定義標誌:我可以使用Go標誌添加命令嗎?

initPtr := flag.String("init", "config.json", "Initialize with config filename") 

我會叫這樣的:

myapp --init=myconfig.json 

雖然我不知道我是否可以定義類似命令,以便調用這樣的應用程序?

myapp init --filename=myconfig.json 
myapp check --filename=myconfig.json 
myapp run 

回答

1

是的,你可以。

查看FlagSet文檔的https://golang.org/pkg/flag/

而對於工作的例子:https://github.com/constabulary/gb/blob/master/cmd/gb/main.go

和示例通過miltonb的要求:

% go run flagset.go init --filename=foo.json foo bar 
init foo.json [foo bar] 
% go run flagset.go check --filename=bar.json 1 2 3 
check bar.json [1 2 3] 
% go run flagset.go run 
run 
% cat flagset.go 
package main 

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

func main() { 
    init := flag.NewFlagSet("init", flag.ExitOnError) 
    initFile := init.String("filename", "myconfig.json", "configuration file") 

    check := flag.NewFlagSet("check", flag.ExitOnError) 
    checkFile := check.String("filename", "myconfig.json", "configuration file") 

    if len(os.Args) <= 1 { 
     flag.Usage() 
     os.Exit(1) 
    } 

    switch os.Args[1] { 
    case "init": 
     if err := init.Parse(os.Args[2:]); err == nil { 
      fmt.Println("init", *initFile, init.Args()) 
     } 
    case "check": 
     if err := check.Parse(os.Args[2:]); err == nil { 
      fmt.Println("check", *checkFile, check.Args()) 
     } 
    case "run": 
     fmt.Println("run") 
    } 
} 
+2

這將是非常酷的,如果你加入的實施是如何工作的一個小例子。 – miltonb

1

你可以做到這一點使用command line argumentsflags的組合。

例如,

configFilePtr := flag.String("filename", "", "Config Filename") 
flag.Parse() 

n := len(os.Args) 
if n > 1 { 
    switch os.Args[1] { 
     case "init": 
      initApp(*configFilePtr) 
     case "check": 
      checkApp(*configFilePtr) 
     case "run": 
      runApp() 
    } 
} 

另一種選擇是使用諸如spf13's cobra之類的東西。

更新:

如果您需要使用不同的標誌的按命令可以使用FlagSetKare Nuorteva的答覆中提到。

例如,

f1 := flag.NewFlagSet("f1", flag.ContinueOnError) 
silent := f1.Bool("silent", false, "") 
f2 := flag.NewFlagSet("f2", flag.ContinueOnError) 
loud := f2.Bool("loud", false, "") 

switch os.Args[1] { 
    case "apply": 
    if err := f1.Parse(os.Args[2:]); err == nil { 
     fmt.Println("apply", *silent) 
    } 
    case "reset": 
    if err := f2.Parse(os.Args[2:]); err == nil { 
     fmt.Println("reset", *loud) 
    } 
} 

Reference

+0

請注意,有些保留標誌不能覆蓋。如果我記得,「建立」和「幫助」是兩個這樣的標誌。 「跑」可能是另一個。 – eduncan911

相關問題