我是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
答案 0 :(得分:7)
The Go Programming Language Specification
块是一个可能为空的声明和语句序列 在匹配的括号内。
Block = "{" StatementList "}" . StatementList = { Statement ";" } .
除了源代码中的显式块之外,还有隐式 块:
Universe块包含所有Go源文本。
每个包都有一个包块,其中包含该包的所有Go源文本。
每个文件都有一个文件块,其中包含该文件中的所有Go源文本。
每个“if”,“for”和“switch”语句都被认为是在它自己的隐式块中。
“switch”或“select”语句中的每个子句都充当隐式块。
阻止嵌套并影响范围。
声明将非空标识符绑定到常量类型, 变量,函数,标签或包。程序中的每个标识符 必须申报。没有标识符可以在同一个文件中声明两次 块,并且文件和包中都不能声明标识符 块。
空白标识符可以像a中的任何其他标识符一样使用 声明,但它没有引入绑定,因此不是 声明。在包块中,仅可以使用标识符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”,“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)