2017-09-23 24 views
0

Golangでの使用状況表示用の外部関数を作成したいが、フラグ変数の呼び出し方法がわからない。Golang:コマンドライン引数未定義:変数

package main 

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

func Usage() { 
    if ArgSend { 
     fmt.Printf("Usage: SEND") 
     flag.PrintDefaults() 
     os.Exit(0) 

    } else if ArgTest { 
     fmt.Printf("Usage: -test") 
     flag.PrintDefaults() 
     os.Exit(0) 

    } else if ArgMacro { 
     fmt.Printf("Usage: -macro") 
     os.Exit(0) 

    } else { 
     fmt.Printf("Usage of: <-test|-send|-macro>\n") 
     os.Exit(0) 
    } 
} 



func main() { 

    //defaults variables 
    ArgTest, ArgSend, ArgMacro := false, false, false 

    // Args parse 
    flag.BoolVar(&ArgTest, "-test", false, "run test mode") 
    flag.BoolVar(&ArgSend, "-send", false, "run send mode") 
    flag.BoolVar(&ArgMacro, "-macro", false, "run macro mode") 

    flag.Parse() 

    Usage() 
} 

戻り、このエラー:これは私の実際のコードである

F:\dev\GoLang\gitlab\EasySend\tmp>go run stackoverflow.go -test 
# command-line-arguments 
.\stackoverflow.go:10:5: undefined: ArgSend 
.\stackoverflow.go:15:12: undefined: ArgTest 
.\stackoverflow.go:20:12: undefined: ArgMacro 

にはどうすればArgSendがfalse/trueの場合はフラグが解析確認できますか?

答えて

0

あなたの例では、間違った物事のカップル:すべてのあなたのフラグ変数が(メイン内で宣言されているので、あなたの使用状況の機能に使用しようとしている

  • 変数がスコープにない
  • 。フラグの変数自体が間違った型である場合、フラグパッケージの型を使用する必要があります
  • その他のエラーには、フラグテキストの前に ' - 'を追加します(第2引数)、フラグ変数の参照を外しませんポインタ)

あり、ここでは良い例です:golang flags exampleは、あなたがトラブルの後、再びここに頼むの例を修正がある場合は、特にデフォルトの動作やカスタムの使用機能のためのgodocs on flagsをチェックする必要があります

更新: 申し訳ありませんが、ピーターがコメントで指摘したように、私の答えはちょっと混乱していて間違っています。

明確化するには、flag.Boolを指定した "golang flags example"リンクで提供されている例で明確になります。 flag.Boolを使用すると、ポインタが返されます。

質問では、bool値を参照できるようにするflag.BoolVarを使用します。問題のflag.BoolVarの使用は実際には正しいです。

だから、あなたがする必要があるすべてはあなたの使い方にやろうとしているものは本当に明確な、スコープの問題ではない対処するが、ここで明確にすべき作業例です:

注:この例ではフラグVARS使用機能で必要とされないため、メインの内部に留まっていた可能性があります。

package main 

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

func Usage() { 
    // custom usage (help) output here if needed 
    fmt.Println("") 
    fmt.Println("Application Flags:") 
    flag.PrintDefaults() 
    fmt.Println("") 
} 

var ArgTest, ArgSend, ArgMacro bool 

func main() { 

    // Args parse 
    flag.BoolVar(&ArgTest, "test", false, "run test mode") 
    flag.BoolVar(&ArgSend, "send", false, "run send mode") 
    flag.BoolVar(&ArgMacro, "macro", false, "run macro mode") 

    flag.Parse() 

    // assign custom usage function (will be shown by default if -h or --help flag is passed) 
    flag.Usage = Usage 

    // if no flags print usage (not default behaviour) 
    if len(os.Args) == 1 { 
     Usage() 
    } 

    fmt.Printf("ArgTest val: %t\n", ArgTest) 
    fmt.Printf("ArgSend val: %t\n", ArgSend) 
    fmt.Printf("ArgMacro val: %t\n", ArgMacro) 

} 
+0

flag.BoolVarとflag.Boolを混同しないでください。 – Peter

+0

@Peterが入力してくれてありがとう、私はうまくいけばポイントを明確にする答えを更新しました – WebweaverD