Golang:未定义命令行参数:变量

Golang:未定义命令行参数:变量,go,Go,我想为Golang中的用法显示创建一个外部函数,但我不知道如何调用flag变量。这是我的实际代码: package main import ( "flag" "fmt" "os" ) func Usage() { if ArgSend { fmt.Printf("Usage: SEND") flag.PrintDefaults() os.Exit(0) } else if ArgTest {

我想为Golang中的用法显示创建一个外部函数,但我不知道如何调用flag变量。这是我的实际代码:

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()
}

如果ArgSend为真/假,我如何检查标志解析?

在您的示例中有两个错误:

  • 您试图在usage函数中使用的变量不在范围内,因为您的所有标志变量都在main()中声明
  • 标志变量本身的类型错误,应使用标志包中的类型
  • 其他错误包括,在标志文本(第二个参数)前面添加“-”,以及未取消对标志变量的引用(它们将是指针)
这里有一个很好的例子:您应该特别检查默认行为和自定义使用函数,如果您在修改示例时遇到问题,请在这里再次询问

更新: 对不起,正如彼得在评论中指出的,我的回答有点混乱和不正确

为了澄清,在“golang flags example”链接中提供的示例中,使用了给定的flag.Bool。当使用flag.Bool时,返回一个指针

在问题中,您使用flag.BoolVar,它允许您引用bool值。您在问题中使用flag.BoolVar实际上是正确的

因此,您所需要做的只是解决范围界定问题,并不真正清楚您在使用时试图做些什么,但下面是一个工作示例,应该说明:

注意:在本例中,标志变量可以留在main中,因为它们在Usage函数中不是必需的

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)

}

不要把flag.BoolVar和flag.Bool混淆。@Peter谢谢你的输入,我已经更新了答案,希望它能澄清问题
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)

}