为什么Go认为我没有使用声明的变量?

为什么Go认为我没有使用声明的变量?,go,Go,我是新手,想知道为什么Go认为我没有使用vpcGrp?您将如何编写此代码 这是我的密码: var vpcGrp *ec2.SecurityGroup grpExists := false resp, err := svc.DescribeSecurityGroups(params) if err != nil { log.Error(err) } else { for _, v := range resp.SecurityGroups { if *v.GroupN

我是新手,想知道为什么Go认为我没有使用vpcGrp?您将如何编写此代码

这是我的密码:

var vpcGrp *ec2.SecurityGroup
grpExists := false
resp, err := svc.DescribeSecurityGroups(params)
if err != nil {
    log.Error(err)
} else {
    for _, v := range resp.SecurityGroups {
        if *v.GroupName == grpName {
            log.Debug("VPC Security Group Found [", grpName, "]")
            vpcGrp = v
            grpExists = true
        }
    }
}

if !grpExists {
    vpcGrp, err := createDbSecurityGrp(grpName, vpcId, region)
    if err != nil {
        log.Error(err)
        return nil, err
    }
}

return vpcGrp, nil

块可能是声明和语句的空序列 在匹配的支架内

Block = "{" StatementList "}" .
StatementList = { Statement ";" } .
除了源代码中的显式块,还有隐式块 区块:

  • 宇宙块包含所有Go源文本

  • 每个包都有一个包块,其中包含该包的所有Go源文本

  • 每个文件都有一个文件块,其中包含该文件中的所有Go源文本

  • 每个“if”、“for”和“switch”语句都被认为位于其自己的隐式块中

  • “switch”或“select”语句中的每个子句都充当隐式块

块嵌套和影响范围

声明将非空标识符绑定到常量、类型、, 变量、函数、标签或包。程序中的每个标识符 必须申报。同一时间内不能声明两次标识符 块,并且不能在文件和包中声明任何标识符 街区

空白标识符可以像计算机中的任何其他标识符一样使用 声明,但它不引入绑定,因此不是 宣布。在包块中,只能使用标识符init 对于init函数声明,和它所做的空白标识符一样 不引入新的绑定

Declaration   = ConstDecl | TypeDecl | VarDecl .
TopLevelDecl  = Declaration | FunctionDecl | MethodDecl .
声明标识符的范围是中源文本的范围 标识符表示指定的常量、类型、变量, 函数、标签或包

Go使用块进行词汇范围划分:

  • 预声明标识符的作用域是universe块
  • 标识符的范围,表示在顶层(任何函数外部)声明的常量、类型、变量或函数(但不是方法) 是包块
  • 导入包的包名称的范围是包含导入声明的文件的文件块
  • 表示方法接收器、函数参数或结果变量的标识符的范围是函数体
  • 在函数中声明的常量或变量标识符的范围从ConstSpec或VarSpec(ShortVarDecl)的末尾开始 对于短变量声明),并在最内层的末尾结束 包含块
  • 在函数中声明的类型标识符的范围从TypeSpec中的标识符开始,到最里面的标识符结束 包含块
块中声明的标识符可以在内部块中重新声明。 当内部声明的标识符在范围内时,它表示 由内部声明声明的实体

短变量声明使用以下语法:

ShortVarDecl = IdentifierList ":=" ExpressionList .
它是带有初始值设定项的正则变量声明的缩写 表达式但无类型:

"var" IdentifierList = ExpressionList .
短变量声明只能出现在函数内部。在某些方面 上下文,例如“if”、“for”或“switch”的初始值设定项 语句,它们可用于声明局部临时变量

if !grpExists {
    vpcGrp, err := createDbSecurityGrp(grpName, vpcId, region)
    if err != nil {
        log.Error(err)
        return nil, err
    }
}
每个“if”、“for”和“switch”语句都被认为位于其自己的隐式块中

块中声明的标识符可以在内部块中重新声明。当内部声明的标识符在范围内时,它表示由内部声明声明的实体

在某些上下文中,例如“if”、“for”或“switch”语句的初始值设定项,可以使用短变量声明来声明局部临时变量

if !grpExists {
    vpcGrp, err := createDbSecurityGrp(grpName, vpcId, region)
    if err != nil {
        log.Error(err)
        return nil, err
    }
}
vpcGrp
是一个已设置但未读取的局部变量;它没有被使用
err
是一个本地变量,既可以设置也可以读取;它被使用了

由于已在外部作用域中声明了
vpcGrp
err
,请重试

 vpcGrp, err = createDbSecurityGrp(grpName, vpcId, region)