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

时间:2015-01-15 09:33:30

标签: for-loop go

另一个初学者对golang的问题:

我可以写:

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

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

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

我很惊讶我无法在for循环的start语句中指定类型。我需要写这样的东西:

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

我在这里错过了一点吗?有没有解释呢?

2 个答案:

答案 0 :(得分:10)

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

BTW你可以做这样的事情:

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

答案 1 :(得分:2)

根据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++ {}

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

让我们仔细研究一下:

i := 0

在右侧有0:它是一个无类型的数字常量。请注意,Go中的无类型常量具有默认类型,如果需要类型,则使用该类型,如本例所示。非类型化整数常量的默认类型为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

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

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

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