For loop 如何在Go中声明循环变量的变量类型?

For loop 如何在Go中声明循环变量的变量类型?,for-loop,go,variable-declaration,For Loop,Go,Variable Declaration,请参阅此代码 package main import ( "fmt" ) func main() { var arr [4]string = [4]string{"foo", "bar", "baz", "qux"} for a, b := range arr { fmt.Println(a, b) } // How can I fix this code? /* for x int, y string = rang

请参阅此代码

package main

import (
    "fmt"
)

func main() {
    var arr [4]string = [4]string{"foo", "bar", "baz", "qux"}

    for a, b := range arr {
        fmt.Println(a, b)
    }

    // How can I fix this code?
    /*
    for x int, y string = range arr {
        fmt.Println(a, b)
    }
    */
}
第一个for循环使用
:=
运算符自动推断
a
b
的类型。但是如果我想显式地指定循环变量的类型呢?我尝试这样做是在注释代码的第二块中,当然失败了,出现了以下错误

# command-line-arguments
./foo.go:15: syntax error: unexpected name, expecting {
./foo.go:18: syntax error: unexpected }

您能否帮助我修复第二块代码,以便我可以明确指定
x
y
的类型?

不幸的是,语言规范不允许您在for循环中声明变量类型。你能得到的最接近的结果是:

var a int
var b string
for a, b = range arr {
    fmt.Println(a, b)
}
但通常,如果给变量起有意义的名称,它们的类型也会很清楚:

for index, element := range arr {
    fmt.Println(index, element)
}

您需要首先声明
变量

var x int
var y string ...// now it should be ok.

for x,y = range arr {
    fmt.Println(x, y) // it should be x and y instead of a,b
}

首先检查您的代码是否为无效的Go代码。for range循环返回数组、切片、字符串或映射的索引和值,因此没有理由显式指定值和索引的类型

您在变量初始化时指定了值的类型,语言将在范围迭代中推断出该类型

一种特殊情况是使用
接口{}
作为变量类型。在这种情况下,如果需要知道值的类型,可以使用
reflect
包推断值的类型

switch reflect.TypeOf(t).Kind() {
case reflect.Slice:
    s := reflect.ValueOf(t)

    for i := 0; i < s.Len(); i++ {
        fmt.Println(s.Index(i))
    }
}
switch reflect.TypeOf(t).Kind(){
case reflect.Slice:
s:=反射值(t)
对于i:=0;i
这是不可能的,因为您试图在同一行中声明两种不同类型的数据,如果您想要显式声明变量,那么您需要像上面的答案一样在声明变量之前声明它们,但是如果您想要它们是另一种类型,那么您需要根据需要对它们进行转换

package main

import (
    "fmt"
)

func main() {
    var arr = [4]string{"foo", "bar", "baz", "qux"}

    var x int64
    var b []byte
    for x = 0; x < int64(len(arr)); x++ {
        b = []byte(arr[x])
        fmt.Println(x, b)
    }
}
主程序包
进口(
“fmt”
)
func main(){
var arr=[4]字符串{“foo”、“bar”、“baz”、“qux”}
var x int64
变量b[]字节
对于x=0;x
可能重复您为什么要这样做?可能有更好的解决方案。@Flimzy我想这样做是为了了解在围棋语言中是否可行。在围棋中不可能这样做。根据您的具体需求,可以通过其他方式实现相同的目标。可能的重复是否有理由在此语句中明确指定变量的类型:
var a int=10
?我想不是。那为什么这是允许的?是的,有。根据您的示例,
10
是任何数字类型的有效值,例如
byte/int16/int/int64
。如果不显式指定类型,编译器会将该类型推断为
int
。如果要声明除
int
以外的变量,则需要明确指定它:
var x float32=10
@putu
var s string=“Foo”
?是否有理由在此语句中显式指定变量的类型?引用语言规范():“与常规变量声明不同,短变量声明可能会重新声明变量,前提是这些变量最初是在同一块中声明的(如果块是函数体,则为参数列表)具有相同的类型,并且至少有一个非空变量是新的。因此,重新声明只能出现在多变量短声明中。重新声明不会引入新变量,只会为原始变量分配一个新值。“如果右侧值的类型是“唯一的”,您不需要显式指定变量类型。显式指定类型将使声明更长,而无需添加信息(与短版本相比)。