请参阅此代码。
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
的类型?
答案 0 :(得分:2)
首先,您的代码不是有效的Go代码。 for range循环返回索引以及数组,切片,字符串或映射的值,因此没有理由明确指定值的类型和索引。
您在变量初始化时指定值的类型,语言将推断范围迭代的类型。
一个特例是当您使用interface{}
作为变量类型时。在这种情况下,如果您需要知道值的类型,可以使用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))
}
}
答案 1 :(得分:1)
不幸的是,语言规范并不允许您在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)
}
答案 2 :(得分:1)
您需要先声明vars
。
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
}
检查fiddle
答案 3 :(得分:0)
这是不可能的,因为你试图在同一行中声明两种不同类型的数据,如果你想显式声明变量,那么你需要在它们之前像上面的答案那样声明它们,但是如果你想要它们是其他类型的那么你需要根据自己的需要来隐蔽它们,
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)
}
}