另一个初学者对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++ {}
我在这里错过了一点吗?有没有解释呢?
答案 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声明只是一个简单的赋值。