草庐IT

戈朗 : command-line-arguments undefined: variable

coder 2024-07-09 原文

我想在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()
}

返回这个错误:

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 是真/假,我如何检查标志解析?

最佳答案

您的示例中有几处错误:

  • 您尝试在使用函数中使用的变量不在范围内,因为您所有的标志变量都在 main (.
  • 标志变量本身的类型错误,您应该使用标志包中的类型
  • 其他错误包括,在标志文本(第二个参数)的前面添加“-”并且没有取消引用标志变量(它们将是指针)

这里有一个很好的例子:golang flags example你应该检查godocs on flags特别是对于默认行为和自定义使用函数,如果您在修改示例时遇到问题,请在此处再次询问

更新: 抱歉,正如彼得在评论中指出的那样,我的回答有点困惑和不正确。

澄清一下,在“golang 标志示例”链接中提供的示例中,使用了给定的 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)

}

关于戈朗 : command-line-arguments undefined: variable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46381817/

有关戈朗 : command-line-arguments undefined: variable的更多相关文章

  1. ruby - 检查 "command"的输出应该包含 NilClass 的意外崩溃 - 2

    为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar

  2. ruby-on-rails - 如何使用 instance_variable_set 正确设置实例变量? - 2

    我正在查看instance_variable_set的文档并看到给出的示例代码是这样做的:obj.instance_variable_set(:@instnc_var,"valuefortheinstancevariable")然后允许您在类的任何实例方法中以@instnc_var的形式访问该变量。我想知道为什么在@instnc_var之前需要一个冒号:。冒号有什么作用? 最佳答案 我的第一直觉是告诉你不要使用instance_variable_set除非你真的知道你用它做什么。它本质上是一种元编程工具或绕过实例变量可见性的黑客攻击

  3. ruby parslet : parsing multiple lines - 2

    我正在寻找一种匹配多行Parslet的方法。代码如下所示:rule(:line){(match('$').absent?>>any).repeat>>match('$')}rule(:lines){line.repeat}但是,lines将始终以无限循环结束,这是因为match('$')将无休止地重复以匹配字符串的结尾。是否可以匹配可以为空的多行?irb(main)>lines.parse($stdin.read)Thisisamultilinestring^D应该匹配成功。我错过了什么吗?我还尝试了(match('$').absent?>>any.maybe).repeat(1)>>

  4. ruby - Chef : Read variable from file and use it in one converge - 2

    我有以下代码,它下载一个文件,然后将文件的内容读入一个变量。使用该变量,它执行一个命令。这个配方不会收敛,因为/root/foo在编译阶段不存在。我可以通过多个聚合和一个来解决这个问题ifFile.exist但我想用一个收敛来完成它。关于如何做到这一点有什么想法吗?execute'download_joiner'docommand"awss3cps3://bucket/foo/root/foo"not_if{::File.exist?('/root/foo')}endpassword=::File.read('/root/foo').chompexecute'join_domain'd

  5. ruby 代码 : why put colon in front of variable name (inside initialize method) - 2

    我遇到了一些Ruby代码,我试图理解为什么变量在initialize方法声明中的名称末尾有冒号。冒号有什么原因吗?attr_reader:var1,:var2definitialize(var1:,var2:)@var1=var1@var2=var2end 最佳答案 那些是关键字参数。您可以按名称而非位置使用它们。例如ThatClass.new(var1:42,var2:"foo")或ThatClass.new(var2:"foo",var1:42)Anarticleaboutkeywordargumentsbythoughtbot

  6. ruby - 混帐 & ruby : How can I unset the GIT_DIR variable from inside a ruby script? - 2

    我编写了一个非常简单的“部署”脚本,作为我的裸git存储库中的post-updateHook运行。变量如下livedomain=~/mydomain.comstagingdomain=~/stage.mydomain.comgitrepolocation=~/git.mydomain.com/thisrepo.git(bare)core=~/git.mydomain.com/thisrepo.gitcore==addedremoteintoeachlive&stagegitslive和stage都初始化了gitrepos(非裸),我已经将我的裸仓库作为远程添加到它们中的每一个(名为co

  7. ruby - : mean in rails before a variable name? 是什么 - 2

    例如,:符号-我正在尝试弄清楚:的含义,以及它与@的区别也没有任何符号。如果有真正有用的指南! 最佳答案 它是一个符号,是一种Ruby语言结构。符号类似于字符串,但thisblogpost解释细节。@表示类的实例变量:它基本上是一个在类实例的所有方法之间共享的变量。它与:无关。 关于ruby-:meaninrailsbeforeavariablename?是什么,我们在StackOverflow上找到一个类似的问题: https://stackoverflow

  8. ruby - :variable and @variable 之间的差异 - 2

    作为RubyonRails新手,我明白“@”和“:”引用有不同的含义。我看到了thispost在SO中,其中描述了一些差异。@表示实例变量(例如@my_selection):表示别名(例如:my_selection)我遇到了一个情况,我有一个标准的MVC页面,类似于我的网络应用程序中的所有其他表单/页面。html.erb片段route.rb片段resources:my_selections当我尝试访问此页面时,出现此错误:NoMethodErrorinselections#createShowingC:/somedir/myapp/app/views/my_selections/ind

  9. css - rails 萨斯 : variables are not passed with @import - 2

    我有一个使用twitterbootstrap和sass的Rails元素。scss文件结构化到文件夹中,所以我有更好的概述。现在我想为包含我的颜色等的全局变量定义一个文件,并将这些值传递给其他文件,这样我就有更少的冗余代码。虽然所有代码都已正确导入和应用,变量不起作用。这是当前的设置:样式表/application.css.scss/**=require_self*=require_tree*//*stylesheets/||–base/||–_reset.scss#Reset/normalize||–_typography.scss#Typographyrules||–componen

  10. ruby - 如何将字符串格式的毫秒数转换为 HH :MM:SS format in Ruby in under 3 lines of code? - 2

    @scores_raw.eachdo|score_raw|#belowiscodeiftimewasbeingsentinmillisecondshh=((score_raw.score.to_i)/100)/3600mm=(hh-hh.to_i)*60ss=(mm-mm.to_i)*60crumbs=[hh,mm,ss]sum=crumbs.first.to_i*3600+crumbs[1].to_i*60+crumbs.last.to_i@scoressum,:hms=>hh.round.to_s+":"+mm.round.to_s+":"+ss.round.to_s}@score

随机推荐