for循环init语句中的变量声明

variable declaration in init statement of for loop

又一个golang初学者的问题:

我会写:

for i := 0; i < 10; i++ {}

但是如果我希望 i 是特定类型 int64,显然我不应该写:

for var i int64 = 0; i < 10; i++ {}

令我惊讶的是,我无法在 for 循环的开始语句中指定类型。我需要写这样的东西:

var i int64
for i = 0; i < 10; i++ {}

我在这里漏掉了一点吗?有什么解释吗?

for 循环的语言规范指出:The init statement may be a short variable declaration,它是 i := 0 形式的赋值,而不是 var i = 0 形式的声明。至于这背后的原因——我猜是语言的简单性。看这里:http://golang.org/ref/spec#For_statements

顺便说一句,你可以做这样的事情:

for  i := int64(0); i < 10; i++ {
   // i here is of type int64
}

根据Go Language Specification: For statements如果选择ForClause的形式:

ForClause = [ InitStmt ] ";" [ Condition ] ";" [ PostStmt ] .

InitStmt的定义:

SimpleStmt = EmptyStmt | ExpressionStmt | SendStmt | IncDecStmt | Assignment
               | ShortVarDecl .

所以你可以看到如果要在for语句中创建一个新的变量,它只能是一个Short Variable declarations,像这样:

for i := 0; i < 10; i++ {}

短变量声明可用于声明任何类型的新变量,变量的类型将是右侧对应的初始化值的类型。

让我们仔细检查一下:

i := 0

右边有0:它是一个无类型的数值常量。请注意,Go 中的无类型常量有一个 default 类型,如果需要一个类型,就会使用它,就像这种情况。无类型整数常量的默认类型是 int 因此变量 i 将具有 int 类型。

如果您希望它具有 int64 类型,请使用具有 int64 类型的表达式,如下所示:

for i := int64(0); i < 10; i++ {} // Explicit type conversion

const ZERO int64 = 0
for i := ZERO; i < 10; i++ {}     // Typed constant

var vzero int64

for i: = vzero; i < 10; i++ {}    // Expression of type int64

或者使用 var 声明在 for 语句之前创建 i 变量:

var i int64
for i = 0; i < 10; i++ {}         // Variable is declared before for using "var"

请注意,最后一个示例不使用短变量声明,只是一个简单的赋值。