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

时间:2016-03-09 22:16:35

标签: 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.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

1 个答案:

答案 0 :(得分:7)

  

The Go Programming Language Specification

     

Blocks

     

块是一个可能为空的声明和语句序列   在匹配的括号内。

Block = "{" StatementList "}" .
StatementList = { Statement ";" } .
     

除了源代码中的显式块之外,还有隐式   块:

     
      
  • Universe块包含所有Go源文本。

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

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

  •   
  • 每个“if”,“for”和“switch”语句都被认为是在它自己的隐式块中。

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

  •   
     

阻止嵌套并影响范围。

     

Declarations and scope

     

声明将非空标识符绑定到常量类型,   变量,函数,标签或包。程序中的每个标识符   必须申报。没有标识符可以在同一个文件中声明两次   块,并且文件和包中都不能声明标识符   块。

     

空白标识符可以像a中的任何其他标识符一样使用   声明,但它没有引入绑定,因此不是   声明。在包块中,仅可以使用标识符init   对于init函数声明,以及它所做的空白标识符   不引入新的约束力。

Declaration   = ConstDecl | TypeDecl | VarDecl .
TopLevelDecl  = Declaration | FunctionDecl | MethodDecl .
     

声明的标识符的范围是源文本的范围   其中标识符表示指定的常量,类型,变量,   功能,标签或包装。

     

Go使用块进行词法作用:

     
      
  • 预先声明的标识符的范围是Universe块。
  •   
  • 标识符的范围,表示在顶层(在任何函数之外)声明的常量,类型,变量或函数(但不是方法)   是包块。
  •   
  • 导入包的包名称范围是包含导入声明的文件的文件块。
  •   
  • 表示方法接收者,函数参数或结果变量的标识符的范围是函数体。
  •   
  • 在函数内声明的常量或变量标识符的范围从ConstSpec或VarSpec(ShortVarDecl)的末尾开始   对于短变量声明)并在最里面的末尾结束   包含块。
  •   
  • 在函数内声明的类型标识符的范围从TypeSpec中的标识符开始,到最里面的末尾结束   包含块。
  •   
     

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

     

Short variable declarations

     

短变量声明使用语法:

ShortVarDecl = IdentifierList ":=" ExpressionList .
     

它是带初始化程序的常规变量声明的简写   表达式,但没有类型:

"var" IdentifierList = ExpressionList .
     

短变量声明可能只出现在函数内部。在一些   上下文,例如“if”,“for”或“switch”的初始值设定项   语句,它们可用于声明本地临时变量。

每个“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是一个设置和读取的局部变量;它被使用了。

由于vpcGrperr已在外部范围内声明,请尝试

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