【问题标题】:Passing CLI arguments to excutables with 'go run'使用“go run”将 CLI 参数传递给可执行文件
【发布时间】:2017-07-15 11:52:34
【问题描述】:

我有一个程序readfile.go,我想将命令行参数os.Args[1] 也作为readfile.go 提供。

然而,'go run' 认为它是对自身的附加参数,而不是对输出可执行文件的附加参数。是否有一个标志可以告诉“运行”这是可执行文件的参数?

mvaidya@mvaidya-VirtualBox:~/junkeork$ 运行 readfile.go readfile.go 包主:不区分大小写的文件名冲突:“readfile.go”和“readfile.go” mvaidya@mvaidya-VirtualBox:~/junkeork$

错误:

package main:不区分大小写的文件名冲突:“readfile.go”和 "readfile.go"

【问题讨论】:

    标签: go


    【解决方案1】:

    您可以使用-- 将 gofile 与参数分开:

    go run readfile.go -- readfile.go
    

    【讨论】:

    • 这行得通,非常感谢。但是,请注意os.Args[1] 将是--,并且只有os.Args[2] 将是readfile.go
    • 您也可以使用flag 包。 flag.NArg()flag.Arg(i) 无论您使用 go generate foo.go -- my args 还是编译 foo.go 都能获得正确的参数,并将其作为 ./foo -- my args./foo my args 运行。请注意,对于flag.Arg(i),第一个(非标志)参数索引始终为零。
    【解决方案2】:

    为了避免两次获得readfile.go 的歧义,我建议您使用命名为flags。这样也能解决问题。

    例子:

    package main
    
    import (
        "flag"
        "fmt"
    )
    
    func main() {
        cmd := flag.String("cmd", "", "")
        flag.Parse()
        fmt.Printf("my cmd: \"%v\"\n", string(*cmd))
    }
    

    不要忘记使用flag.Parse() 来检索命令行参数

    您可以通过这种方式将 args 传递给 go run 命令:go run .\main.go -cmd main.go,您将得到输出:

    my cmd: "main.go"
    

    我希望这可以帮助其他人。

    【讨论】:

      【解决方案3】:

      janos 的回答可以很好地与未命名的 args 一起使用。对于命名的 args。:

      go run [file].go -arg1Name arg1Value -arg2Name arg2Value.....
      Eg, go run main.go -x 2 -y 5 ; x and y are arg. names
      

      【讨论】:

        猜你喜欢
        • 2018-04-07
        • 2016-09-15
        • 1970-01-01
        • 2012-05-05
        • 1970-01-01
        • 2018-09-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多