2017-09-23 163 views
0

我想創建一個用於在Golang中使用顯示的外部函數,但我不知道如何調用該標誌變量。這是我的實際代碼:Golang:命令行參數undefined:變量

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是真/假?

回答

0

一個錯誤在你的榜樣幾件事情:

  • 你想在你的使用功能使用的變量是不是在範圍,因爲所有的標誌變量主(
  • 的內部聲明標誌變量本身的類型是錯誤的,您應該使用標誌包中的類型
  • 其他錯誤包括在標誌文本(第二參數)的前面添加' - '而不是解引用標誌變量(它們將是指針)

這裏有一個很好的例子:golang flags example,你應該檢查godocs on flags特別是默認行爲,並定製使用的功能,如果你有麻煩修改的例子,然後再次詢問這裏

更新時間: 對不起,正如彼得在評論中指出的那樣,我的回答有點混亂和不正確。

要說明,在「golang標誌示例」提供的示例中給出了flag.Bool鏈接。當使用flag.Bool時,返回一個指針。

在問題中,您使用flag.BoolVar,它允許您引用一個布爾值。您在問題中使用flag.BoolVar實際上是正確的。

因此,所有你需要做的是解決範圍確定問題,真不明白你正在嘗試與您的使用情況做的,但這裏是一個工作的例子,應澄清:

注:本例中的標誌瓦爾可以留在主體內,因爲它們不是必需的使用功能

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

@彼得感謝您的意見,我已經更新了答案,希望能夠澄清一點 – WebweaverD