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"
请注意,最后一个示例不使用短变量声明,只是一个简单的赋值。
又一个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"
请注意,最后一个示例不使用短变量声明,只是一个简单的赋值。